2016-05-06 9 views
1

https://github.com/activeadmin/activeadmin/blob/1c85c5654a2ce1d43d4c64d98b928ff133d46406/lib/active_admin.rb#L95これは& 'ルビーの意味ですか?

このコードでは(ActiveAdminに接頭辞)&は何を意味するのでしょうか?このようgets.split.map(&:to_i)などのオブジェクトの

def before_load(&block) 
    ActiveSupport::Notifications.subscribe(
    ActiveAdmin::Application::BeforeLoadEvent,  
    &ActiveAdmin::Event.wrap_block_for_active_support_notifications(block) 
) 
end 
+1

私はそれが返されたものについてto_procメソッドを呼び出すと信じています。 –

答えて

2

通常&通話to_proc方法は、メソッドの引数でmap { |e| e.to_i }

と同じである、整数の行を読み取るために使用され、それが意味、最後の引数に表示されます。コードブロックを渡した場合は、次のコードで詳細を確認してください。定期的なパラメータの*から& 'スプラット' ブロック(また、その上にto_procを呼び出し)、同様の機能で

def g 
    puts yield "g" 
end 

def h(block) 
    puts block.call "h" 
end 

def f(&block) 
    puts block.class  # => Proc 
    puts block.call "f"  # => hello f 
    g &block    # => hello g  passed as code block 
    h block     # => hello h  passed as proc 
end 

f { |x| "hello " + x } 
4

def before_load(&block) # this binds provided block into block variable 
    ActiveSupport::Notifications.subscribe(ActiveAdmin::Application::BeforeLoadEvent){|some_params_maybe| 
    ActiveAdmin::Event.wrap_block_for_active_support_notifications(block).call(some_params_maybe) 
    } 
end 
+0

ここで重要なことは、必要性をブロックする引数がどれだけあるかを気にする必要がないことです。 – tadman

1

Following articleにやや同等です

は、Rubyの「&」の使用上の良い説明を提供します:Rubyで

暗黙のブロック の方法は、あらゆる種類の引数を取ることができます面白い方法の。特に興味深いケースの1つは、Rubyメソッドがブロックを取得する場合です。

def hello 
end 

hello do 
    puts "hello" 
end 

これはせずに実行されます:

は実際には、すべてのRubyのメソッドは、暗黙的にパラメータリストでこれを指定する必要またはメソッド本体例えば以内にブロックを使用することなく、ブロックを取ることができます私たちは私たちが渡しているブロックを実行していないとのトラブルは何もプリントアウトされます私たちがすることができます - もちろん - 簡単にyieldingでブロックを実行します。

def hello 
    yield if block_given? 
end 

hello do 
    puts "hello" 
end 

ティsの時間は、我々はいくつかの出力を得る:メソッド内のブロックに

hello 

我々yieldedを、しかし、この方法は、ブロックを取るという事実はまだ暗黙的です。

Rubyではオブジェクトをメソッドに渡して、このオブジェクトをブロックとして使用しようとするので、さらに面白いです。メソッドの最後のパラメータの前にアンパサンドを置くと、Rubyはこのパラメータをメソッドのブロックとして扱います。パラメータがの場合、Procオブジェクトが既に存在する場合、Rubyはメソッドとそのブロックを単に関連付けます。

def hello 
     yield if block_given? 
    end 

    blah = -> {puts "lambda"} 

hello(&blah) 
lambda 

パラメータがProcでない場合は、Rubyはそのブロックなどの方法でそれを関連付ける前に、(それにto_procを呼び出すことで)1に変換しようとします。

def hello 
    yield if block_given? 
end 

class FooBar 
    def to_proc 
    -> {puts 'converted lambda'} 
    end 
end 

hello(&FooBar.new) 
converted lambda 

このすべては、かなり明確なようだが、私はメソッドに関連付けられたブロックを取り、別のメソッドに渡すために何をしたい場合は?ブロックを参照する方法が必要です。

Explicitブロック メソッド定義を記述するとき、このメソッドがブロックを取る可能性があると明示的に宣言することができます。紛らわしいこと、Rubyは、同様にこのためのアンパサンドを使用しています。

def hello(&block) 
    yield if block_given? 
end 

hello do 
    puts "hello" 
end 

が私たちのメソッドを定義し、このように、私たちがメソッドの本体内で私たちのブロックを参照することが可能な名前を与えます。そして、私たちのブロックがProcオブジェクトであるため、代わりにそれにyieldingの、我々はそれをcallことができます。

def hello(&block) 
    block.call if block_given? 
end 

hello do 
    puts "hello" 
end 

私はblock.call代わりのyieldを好む、それは物事が明確になります。もちろん、私たちのメソッドを定義するときに、「ブロック」という名前を使用する必要はありません。

def hello(&foo) 
    foo.call if block_given? 
end 

hello do 
    puts "hello" 
end 

これは言いました。 'block'は良い規則です。

関連する問題