ruby - 如何在 ruby​​ proc/lambda 中使用真正的局部变量

标签 ruby

初学者 Ruby 问题。更改此代码的最简单方法是什么,完整保留该 block ,从而消除副作用?

x = lambda { |v| x = 2 ; v}
x.call(3)
#=> 3
x
#=> 2

这是我能想出的最简单的例子来说明我的问题,所以“删除分配”或“不要将 Proc 分配给 x”不是我要找的。

我想在 Proc(或 lambda)中设置局部变量,可以在不影响原始封闭范围的情况下对其进行赋值。我可以动态创建一个类或模块来包装 block ,但对于这样一个基本的东西来说,这似乎有点过分了。

与我正在尝试做的等效的 Python:

def x(v):
  x = 2  # this is a local variable, what a concept
  return v

最佳答案

有时这是期望的行为:

total = 0
(1..10).each{|x| total += x}
puts total

但有时这是偶然的,您不想弄乱恰好具有相同名称的外部变量。在这种情况下,在参数列表后面加上分号和 block 局部变量列表:

x = lambda{|v; x| x = 2; v}
p x.call(3) #3
p x #<Proc:0x83f7570@test1.rb:2 (lambda)>

关于ruby - 如何在 ruby​​ proc/lambda 中使用真正的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16699595/

相关文章:

ruby-on-rails - 未定义方法 `parent' 为 nil :NilClass

ruby-on-rails - 静态设置 : error with Compass integration

ruby-on-rails - ruby open ssl api for encrypted key (without nodes option)

ruby-on-rails - Ruby url 到 html 链接转换

Ruby - 如何将混合数转换为 float ?

ruby-on-rails - 如何在我的 ruby​​ on rails 网站上运行 Ruby 脚本?

ruby - 你如何在 Ruby 中处理 SNMP v3 陷阱?

ruby-on-rails - 如何更新 has_many :through association with strong parameters in Rails 4

javascript - ruby 的 JSON 解析器错误

ruby-on-rails - 从 Helper 获取数据或在 Rails 中使用 Model