このようなものを呼び出すことは可能ですか?
def foo(param1)
hash.select { |k,v| yield }.each do |x|
res += do_something_with(v,param1)
end
res
end
次のようなERBテンプレートから:
<%= foo('A',{ v.field!='X' }) %>
私のハッシュでカスタマイズされた選択を達成するには?
ルビーでは、パラメータ名の前に先頭を追加すると、渡されたブロックを最後のパラメータとして取得できます。&
たとえば&block
、block
変数はProc
メソッドに渡されます。
block
ブロックが渡されなかった場合はnilになります。
ブロックを転送するには、メソッドを呼び出し、最後のパラメーターとして追加します&block
だから今、あなたの問題に対処しましょう:
メソッドの最後の引数でブロックを取得し、それをメソッドに渡しますselect
。
def foo(param1, &block)
hash.select(&block).each do |x|
res += do_something_with(v,param1)
end
res
end
次のようなこともできますが.select { |v| yield(v) }
、これはあまりエレガントではありません:)
あなたの見解には小さな問題があります、これが修正されたバージョンです:
<%= foo('A') { |v| v.field!='X' } %>
&
ブロックの前にと:を付けることで、ブロックをパラメーターとして使用できます。
def foo(¶m1)
そして、あなたはあなたがblock_given?
テストすることができます:
if block_given?
#do something with param1
メソッドfooが主にプレゼンテーションに関連する何かを実行し、ビューからアクセスできるようにする必要がある場合、それを使用するのに最適な場所はおそらくヘルパーです。ヘルパーで宣言されたすべてのメソッドは、erbテンプレートから使用できます。
&synthaxを使用して、メソッドから別のメソッドにブロックを渡すことができます。
def foo(values,&action)
#pass &action to whatever method need it.
end