Ruby - 阻止范围

use*_*721 2 ruby ruby-on-rails

我有一个方法,我想根据场景采取不同的行动,所以我希望能够将一个块传递给该方法,并在给出该块时执行.

但是,我感到困惑的是我传入的块中变量的范围.

例如:

def original_method (a, b, opt = {id: nil, id_map: {}})
  element_id = (opt[:id_map])

  yield if block_given?

end
Run Code Online (Sandbox Code Playgroud)

通过块的新方法:

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
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

undefined local variable or method `element_id' 
Run Code Online (Sandbox Code Playgroud)

在屈服线上.

可以这样做吗?

Aru*_*hit 5

您需要传递局部变量element_id,作为yields参数.

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
Run Code Online (Sandbox Code Playgroud)

接受它像:

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
Run Code Online (Sandbox Code Playgroud)

element_id已在方法内创建局部变量original_method,这就是为什么只能在此方法中访问它.

在方法内部new_method,当您调用附加original_method的方法时,由于关闭功能,它可以访问方法内的所有变量,new_method从开始到创建块的点.