如何编写内联块以包含Ruby中的局部变量范围?

在JavaScript中,以下习语有时用于包含范围

// JavaScript (function() { var x = 0; // do stuff })(); // execute anonymous function in-place // x is undefined (or its previous value) 

你在Perl中看到了这个:

 { local $/ = undef; $file_contents = ; } # $/ == "\n" 

Ruby中有类似的东西吗? 我能想到的最接近的是:

 Proc.new x = 123 puts x end.call # x is undefined 

还有另一种更常见的方式在Ruby中执行此操作,或者这是最好的方法吗?

如果在块之前已经定义了x那么您的示例将不起作用:

 x = 7 Proc.new do x = 123 puts x end.call # x is now 123 

Ruby允许您使用这种相当模糊的语法在块参数列表中指定块局部变量:

 x = 7 Proc.new do |;x| # declare x as block local x = 123 puts x end.call # x is still 7 

之后的任何变量; 被视为该块的本地,并且不会在封闭范围中影响类似命名的变量。

最近的解决方案是使用stabby lambda表示法:

 -> { x = 123 puts x }.call 

Ruby在这种情况下使用匿名过程并不常见。 我能想到的最ruby的方式是将每个试验都放在小巧轻便的课堂上。

使用proc

 proc { ... }[] 

虽然不是很惯用,但已经很小了。 您可以编写自己的包装器,您可能会发现它更优雅,因为它避免了创建匿名function

 def wrap yield end wrap do ... end 

但是,正如@matt指出的那样,这并不妨碍您访问块外定义的变量。