Ruby - 阻止范围

时间:2015-11-02 14:28:39

标签: ruby-on-rails ruby

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

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

例如:

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

  yield if block_given?

end

传递块的新方法:

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' 

在收益率线上。

可以这样做吗?

2 个答案:

答案 0 :(得分:5)

您需要将局部变量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内,当您通过 block 调用方法original_method时,由于 closure 功能,它具有访问方法new_method内的所有变量,从开始到创建块的位置。

答案 1 :(得分:1)

回答你的间接问题:

块的范围是词法,这意味着他们可以访问他们定义的范围中的变量(而不是"用于")。