2012-12-10 20 views
5

Rubyで名前で関数を渡すにはどうすればいいですか? (私はほんの数時間のためのRubyを使用してきたので、私はまだ物事を考え出すしています。)Rubyで関数を名前で渡す

nums = [1, 2, 3, 4] 

# This works, but is more verbose than I'd like  
nums.each do |i| 
    puts i 
end 

# In JS, I could just do something like: 
# nums.forEach(console.log) 

# In F#, it would be something like: 
# List.iter nums (printf "%A") 

# In Ruby, I wish I could do something like: 
nums.each puts 

は、それがRubyでも同様に簡潔に行うことができますか?ブロックを使用するのではなく名前で関数を参照することはできますか?

投票締切:これは本当の質問ではない理由を説明できますか?

+1

これはあなたが探しているものですか? http://stackoverflow.com/questions/522720/passing-a-method-as-a-parameter-in-ruby –

答えて

6

次の操作を行うことができます

nums = [1, 2, 3, 4] 
nums.each(&method(:puts)) 

This articleはprocsの、ブロック、およびRubyでラムダとの違いの良い説明があります。

+0

これはクールです。私は '&method()'を見たことがないと信じられない! –

+0

インスタンスメソッドを指定することもできます。 'nums.each(&$ stderr.method(:puts))' –

3

関数をブロックでラップするのではなく名前で参照できますか?

ブロックしていません - ブロックは、機能がです。

簡潔が懸念される場合は、代わりにdo..endのブラケットを使用することができます。

nums.each {|i| puts i} 
0

ないアウト・オブ・ボックス、あなたがmethod使用できますが:

def invoke(enum, meth) 
    enum.each { |e| method(meth).call(e) } 
end 

を、私はそれを好みますmonkeypatchedに包まれたEnumerable

これについては別の方法もあります。これは一種のブルートフォースです。

関連する問題