6

我希望我不会在这里重复任何人,但我一直在搜索谷歌和这里并没有想出任何东西。这个问题实际上更像是“性感化”我的代码的问题。

我特别想做的是:

Dir.new('some_directory').each do |file|
  # is there a way to refer to the string 'some_directory' via a method or variable?
end

谢谢!

4

3 回答 3

7

不是一般的;调用块的参数完全取决于方法本身,当调用时(调用你的块),字符串被传递给each的事实早已被遗忘,即它们是完全不同的东西。'some_directory'Dir.new

不过,您可以执行以下操作:

Dir.new(my_dir = 'some_directory').each do |file|
    puts "#{my_dir} contains #{file}"
end
于 2012-05-16T22:24:57.953 回答
2

它不起作用的原因是它neweach两种不同的方法,因此它们无法访问彼此的参数。要“性感”您的代码,您可以考虑创建一个新方法来包含两个方法调用并将重复的参数传递给它:

def do_something(dir)
  Dir.new(dir).each do |file|
    # use dir in some way
  end
end

创建一个新方法的开销如此之低的事实意味着为这么小的代码块创建一个方法是完全合理的——这也是使 Ruby 成为一种令人愉快的语言的众多原因之一。

于 2012-05-16T22:24:17.440 回答
0

只需将其分解为变量即可。Ruby 块是闭包,因此它们可以访问 -

dir = 'some_directory'
Dir.new(dir).each do |file|
  # use dir here as expected.
end
于 2012-05-16T22:24:50.123 回答