Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby块范围_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Ruby块范围

Ruby on rails Ruby块范围,ruby-on-rails,ruby,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

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

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

例如:

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' 
在屈服线


可以这样做吗?

您需要传递局部变量
元素id
,作为
产生
的参数

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\u id
局部变量是在方法
原始\u方法
中创建的,这就是为什么它只能在该方法中访问


在方法
new\u method
内部,当调用方法
original\u method
并附加块时,由于闭包功能,它可以访问方法
new\u method
内部从开始到创建块的所有变量。

回答间接问题:


块的作用域是词汇性的,这意味着它们可以从定义它们的作用域中访问变量(而不是“用于”)。

(opt[:id\u map]
之后缺少一个右括号