4

オブジェクトに渡されたブロックの内容を返す Ruby のメソッドはありますか?

たとえば、配列に入れたいオブジェクトがある場合はどうすればよいでしょうか?

理想的な世界では、次のことを行います(私が探しているもの):

"string".reverse.upcase.something{ |s| send(s) }

これは、次のように、オブジェクトを含む配列を返します。

send("string".reverse.upcase)

最初からオブジェクトを持っている場合、これはチェーン可能ではなく、より複雑なシナリオでは混乱する可能性があります。

したがって、このsomethingメソッドは のようにブロックの評価を返しますArray#mapが、1 つの要素に対してのみです。

4

4 に答える 4

4

そのような組み込みのことは知りませんが、自分で簡単に行うことができます:

class Object
  def something(&block)
    block.call(self)
  end
end

p "foo".something { | o | [o] }
p 23.something { | x | p x; 42 }

与える

["foo"]      # object "foo" put into an array
23           # object handed to block
42           # something return block's result
于 2011-09-28T11:44:07.880 に答える
1

標準ライブラリに同様の機能が欲しいと思うことがあります。名前は、たとえば、withまたはwith_it

(以前のコードを新しい名前で繰り返す)

class Object
  def with_it(&block)
    block.call(self)
  end
end

使用例:

x = [1, 2, 3, 4, 5].map {|x| x * x }.with_it do |list|
   head = list.unshift
   list << head * 10
   list.join " / "
end

とは対照的に:

list = [1, 2, 3, 4, 5].map {|x| x * x }
head = list.unshift
list << head * 10
x = list.join " / "

後者の方が理解しやすいですが、前者には変数listheadスコープを保持するという利点がありx、私の意見では、への割り当てはより明確です (への割り当てxはコードの最後の行に挿入する必要があります)。コードがより大きなメソッドの一部である場合、スコープは有益です。

したがって、使用する別のオプションwith_itは、コードを別のメソッドに入れることです。例えば:

def mult_head_and_join(list)
    head = list.unshift
    list << head * 10
    list.join " / "
end

x = mult_head_and_join [1, 2, 3, 4, 5].map {|x| x * x }

ここで何を結論付ければよいかわかりませんが、 with_it を標準ライブラリに含めることに投票したいと思います

于 2014-04-15T08:48:48.623 に答える
1

Object.tapをお探しですか?

于 2011-09-28T11:28:07.923 に答える