我有一个方法,我想根据场景采取不同的行动,所以我希望能够将一个 block 传递给该方法,并在给定 block 时执行。
但是,我对传入的 block 中的变量范围感到困惑。
例如:
def original_method (a, b, opt = {id: nil, id_map: {}})
element_id = (opt[:id_map])
yield if block_given?
end
以及传递 block 的新方法:
def new_method(a, b, opt)
original_method (a, b, opt) do
if(element_id.include? "some text")
puts "it has some text"
end
end
end
但是我得到了错误:
undefined local variable or method `element_id'
在让行线上。
这可以做到吗?
最佳答案
您需要传递局部变量 element_id
,作为 yield
的参数。
def original_method (a, b, opt = {id: nil, id_map: {}})
element_id = opt[:id_map]
yield(element_id) if block_given? # pass it as argument
end
然后像这样接受它:
def new_method(a, b, opt)
original_method (a, b, opt) do | element_id | # receive as block pramater
if(element_id.include? "some text")
puts "it has some text"
end
end
end
element_id
局部变量已在方法 original_method
中创建,这就是为什么它只能在此方法中访问的原因。
在方法 new_method
中,当您调用方法 original_method
时附加了一个 block,由于 closure 能力,它可以访问方法 new_method
从开始到创建 block 的所有变量。
关于ruby-on-rails - Ruby - block 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479917/