2012-05-16 8 views
6

私はここに誰も繰り返さないことを願っていますが、私はここでGoogleを検索しています。この質問は、実際に私のコードを「セクシュアル化」する問題です。ruby​​で渡されたブロック内のメソッドに渡されるパラメータを参照することはできますか?

私は特にやろうとしていますが、これは次のとおりです。

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

ありがとう!

答えて

7

一般的ではありません。メソッド自体にブロックがどのような引数を持って呼び出されているのかが完全にわかります。eachが呼び出され(ブロックを呼び出す)、文字列'some_directory'Dir.newに渡されたということは、長い間忘れられています別々のもの。

あなたはしかし、このような何かを行うことができます。

Dir.new(my_dir = 'some_directory').each do |file| 
    puts "#{my_dir} contains #{file}" 
end 
+1

Oooo、私はそれが好きです!私はそれが合法であることも知らなかった。私はまだルビーn00bです。申し訳ありませんが、私はすべて投票できない、私はまだ評判がありません。 –

+0

これはまさに私が探していたものです。私はちょうど1行のコードを保存しようとしていましたが、これはそれです:) –

+0

:)!これはコンパクトにする良い方法ですが、大部分の良いものと同様に、過度の使用はコードを読めなくなるので、あまり使用しないでください。 (私はそれがここで意味をなさないと思う) – Ashe

2

neweachは2つの異なる方法であるため、お互いのパラメータにアクセスすることができません。あなたのコード「sexify」に、次の2つのメソッドの呼び出しが含まれており、それに繰り返してパラメータを渡すための新しい方法を作成することを検討できます。

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

新しいメソッドを作成することは、このような低いオーバーヘッドを持っているという事実は、それが完全だ意味しますこれほど小さなコードのためのものを作成することは妥当であり、Rubyがそのような言語の喜びを働かせる多くの理由の1つです。

+0

クール。私はそれを恐れていた。私は変数に 'some_directory'を割り当てることができますが、私は1行全体を保存しようとしていました:)ありがとう! –

+0

問題ありません! :-) – Russell

+0

Whoa、明らかに私はここにいると知っていますが、私が最初に答えたときには答えの最初の行だけが表示されていました。人々はここですばやく反応します!皆さんありがとう! –

0

変数に分解してください。 Rubyブロックはクロージャーなのでアクセス可能です -

関連する問題