Ruby:如何使块中的方法内部的变量可见?

Ruby:如何使块中的方法内部的变量可见?,ruby,ruby-block,Ruby,Ruby Block,下面的代码给了我 name错误:未定义的局部变量或方法'dir' 在提取快照方法中 该代码用于从视频中提取快照,将其存储在创建的临时目录中,将快照发送到服务,然后删除该目录 def执行 使用临时目录do | dir| 提取快照 发送快照 结束 结束 使用临时目录(&b)的def Dir.mktmpdir{| Dir | b.call(Dir)} 结束 def提取快照 系统“ffmpeg-i#{video#u file_path}-vf fps=1/#{INTERVAL}{dir}/%04d.jp

下面的代码给了我
name错误:未定义的局部变量或方法'dir'
在提取快照方法中

该代码用于从视频中提取快照,将其存储在创建的临时目录中,将快照发送到服务,然后删除该目录

def执行
使用临时目录do | dir|
提取快照
发送快照
结束
结束
使用临时目录(&b)的def
Dir.mktmpdir{| Dir | b.call(Dir)}
结束
def提取快照
系统“ffmpeg-i#{video#u file_path}-vf fps=1/#{INTERVAL}{dir}/%04d.jpg”
结束
我认为,dir变量应该在extract_快照和send_快照中可见,因为它处于同一级别。但它不在这些方法的范围之内。 是否可以在不执行以下操作的情况下使dir变量可见:

def dir
  @dir
end

def dir=(val)
  @dir=(val)
end
def执行
使用临时目录do | dir|
提取快照(目录)
发送快照(目录)
结束
结束

您可以使用以下方法执行类似操作:

作为解释,
attr\u accessor
为您创建读写器方法,相当于以下方法:

def dir
  @dir
end

def dir=(val)
  @dir=(val)
end
注意:在我看来,按照你在问题末尾指定的方式来做没有什么错,所以根据你的情况选择:)


希望这有帮助-让我知道你进展如何,或者如果你有任何问题。

为什么“不执行以下操作而使dir变量可见”???你的最后一个例子绝对是正确的方法。我希望,让代码更干净。少代码并不总是更干净的代码。您需要的是如何在方法之间创建隐式依赖关系。这是最肮脏的反模式之一,更复杂,更容易出错,灵活性更低。这回答了所问的问题,但总的来说不是一个好主意。非常感谢。我有一个关于实例变量的想法,但我想弄清楚,在理解块的局部变量范围时是否遗漏了一些东西。在我的示例中,extract_snapshots是在与dir变量相同的上下文中调用的:
使用_temporary_directory{| dir | extract_snapshots}
因此,我认为,该变量应该在方法内部可见。但我似乎理解正确:如果dir变量在定义extract_Snapshot的上下文中可见,那么闭包就可以工作了。@Max感谢您的反馈,我倾向于同意-我的问题的早期版本在这方面更清楚,尽管为了简洁,我将其删减了。希望这有助于澄清这一问题,尽管mSourire:)