2014-10-08 93 views
4

在C中,可以使用语句块将局部变量与其父作用域隔离。Ruby变量作用域块

int foo() { 
    { 
     int a; 
    } 
    // Here `a` is no longer in the scope. 
} 

但是在Ruby中,以下解析失败。

def foo 
    do 
     a = 1 
    end 
    puts a 
end 

是否有把把变量隔离到Ruby中的作用域的技巧?

+0

宣告内嵌块的符号是'开始...... end',而不是'做... end'。 – tadman 2014-10-08 20:28:54

+3

在Ruby中,_scope_ gates由3个关键字创建:'def','class'和'module'。 – 2014-10-08 20:31:11

+0

https://www.cs.auckland.ac.nz/references/ruby/doc_bundle/Newcomers/ruby.html#blocks – 2014-10-08 20:34:37

回答

2

以下的工作,但我怀疑还有其他的方法。

proc { 
    a = 5 
}.call 
3

在大多数情况下,最合适的“内部范围”是一个单独的方法。通常,如果某个算法块中的某些数据不应在外部可见,则应将该块抽取为单独的方法。而且它可能是,这个块可以作出一个很好的论点。

As the docs state,这些都是具有其自己的局部变量范围的情况下:

  • proc{ ... }(因而,在方法调用块)
  • loop{ ... }(接受一个块的方法,同上文)
  • def ... end(方法实现)
  • class ... end
  • module ... end
  • 整个程序(这是没有用的,虽然问题的范围)