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は2つの異なる方法であるため、互いのパラメーターにアクセスできないためです。コードを「性別化」するには、2つのメソッド呼び出しを含む新しいメソッドを作成し、繰り返されるパラメーターをそれに渡すことを検討できます。

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

新しいメソッドを作成するオーバーヘッドが非常に低いという事実は、これと同じくらい小さなコードのチャンクに対してメソッドを作成することが完全に合理的であることを意味します。これは、Rubyを言語の操作の喜びにする多くの理由の1つです。

于 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 に答える