2

このようなものを呼び出すことは可能ですか?

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' }) %>

私のハッシュでカスタマイズされた選択を達成するには?

4

3 に答える 3

2

ルビーでは、パラメータ名の前に先頭を追加すると、渡されたブロックを最後のパラメータとして取得できます。&たとえば&blockblock変数は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' } %>
于 2013-03-24T10:44:35.320 に答える
1

&ブロックの前にと:を付けることで、ブロックをパラメーターとして使用できます。

def foo(&param1)

そして、あなたはあなたがblock_given?テストすることができます:

if block_given?
  #do something with param1
于 2013-03-24T10:39:12.027 に答える
0

メソッドfooが主にプレゼンテーションに関連する何かを実行し、ビューからアクセスできるようにする必要がある場合、それを使用するのに最適な場所はおそらくヘルパーです。ヘルパーで宣言されたすべてのメソッドは、erbテンプレートから使用できます。

&synthaxを使用して、メソッドから別のメソッドにブロックを渡すことができます。

def foo(values,&action)
  #pass &action to whatever method need it.
end
于 2013-03-24T10:42:43.993 に答える