ruby-on-rails - Ruby - block 作用域

标签 ruby-on-rails ruby

我有一个方法,我想根据场景采取不同的行动,所以我希望能够将一个 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/

相关文章:

c# - 通过 COM 从 Ruby 调用 C# .dll

ruby-on-rails - 如何删除嵌套 has_many 关联中关联的所有对象?

ruby-on-rails - 如何将身份验证 token 添加到每个 http RSpec 测试 header

ruby - 使用 ruby​​ 在 git 中 checkout 标签?

ruby - 在定义类方法时规避 Ruby 的作用域门

javascript - 表单提交字段为空白。使用 Javascript 隐藏和显示字段

jquery - 如何在 Rails 中创建级联菜单?

ruby-on-rails - 访问部署在 Google Cloud Run 中的应用程序的 Rails 控制台

ruby-on-rails - 删除rails中的标签时外键无效

ruby-on-rails - 如何在 rails text_area 字段中允许多行内容?