块中的局部变量

Sur*_*der 3 ruby lambda

在这个例子中

x = 1

foo = lambda do
  x = 2
end

foo.call
Run Code Online (Sandbox Code Playgroud)

foo会改变x的值.是否可以隐藏x的值,使其在proc调用之前和之后保持不变?

Eri*_*nil 7

阻止局部变量

如果你不知道确切的术语,我同意它不是非常可谷歌的.干得好 :

x = 1

foo = lambda do
  x = 2
end

foo.call

p x # => 2

x = 1

foo = lambda do |;x|
  x = 2
end

foo.call

p x # => 1
Run Code Online (Sandbox Code Playgroud)

它从Ruby 1.9开始就可用,但我不经常遇到它(如果有的话).它在这里描述,它被称为"块局部变量"或"块局部参数":

您还可以使用';'向块声明块本地参数 在块参数列表中.分配给块本地参数不会覆盖调用者范围内块之外的本地参数

替代

@EliSadoff和@tadman在评论中提出了非常有用的观点.

这些块局部变量经常不被使用是有充分理由的:在块中遮蔽外部变量通常不是一个好主意.它可能使代码更难阅读,更难理解并且更难使用.

对于Ruby块,外部和块变量通常是相关的,但不相同:

  • filename作为外部变量,file作为块变量IO.open
  • array作为外部变量,element作为块变量Array#each
  • strings作为外部变量,string作为块变量Array#map

如果你需要一个绑定变量,并x已被用作外部变量,只要使用y,i,z,m,nwhatever.

  • @mudasobwa Ruby在这些情况下为你提供了摆脱困境的方法,它使功能更加完善.仅仅因为你*可以*做某事并不意味着你应该做,但是有这个选择很好. (2认同)