3

重複の可能性:
ruby​​ に「パイプ」に相当するものはありますか?

Rubyでメソッドを見ていtapますが、残念ながら、渡されたブロックから返されたオブジェクトは渡されません。オブジェクトを渡すにはどのような方法を使用しますか?

これが私が(失敗して)やろうとしていることです:

obj.tap{ |o| first_transform(o) }.tap{ |o| second_transform(o)}

もちろん、これは と同等second_transform(first_transform(o))です。私は最初の方法でそれを行う方法を尋ねているだけです。

これを行うことは、リストでは簡単です:

list.map{ |item| first_transform(item) }.map{ |item| second_transform(item)}

オブジェクトの場合、なぜそれほど簡単ではないのでしょうか?

4

3 に答える 3

3
class Object
  def as
    yield self
  end
end

これで、次のことができます[1,2,3].as{|l| l << 4}.as{|l| l << 5}

于 2013-01-08T11:35:10.513 に答える
-1

アイテムのクラスのメソッドを作成#first_transformおよびインスタンス化することも検討できます (もちろん、変換されたアイテムを返します)。#second_transform

これらのメソッド定義は次のようになります。

class ItemClass
  # If you want your method to modify the object you should
  # add a bang at the end of the method name: first_transform!
  def first_transform
    # ... Manipulate the item (self) then return it
    transformed_item
  end
end

このようにして、メソッド呼び出しを次のように連鎖させることができます。

list.map {|item| item.first_transform.second_transform }

私の謙虚な意見では、それはさらによく読みます;)

于 2013-01-08T11:39:14.473 に答える
-1

簡単な答えはtap、あなたが思っていることをしないということです。

tapオブジェクトで呼び出され、常に同じオブジェクトを返します。

の簡単なtap使用例として

"foo".tap do |foo|
  bar(foo)
end

これはまだ戻ります"foo"

あなたの例では、オブジェクトがあり、2 つの関数を連続して適用したいと考えています。

second_transform(first_transform(obj))


更新しました:

では、なぜこのように連鎖させたいのかをお聞きしたいと思います。

obj.do{|o| first_transform(o)}.do{|o| second_transform(o)}

それは本当により明確ですか

second_transform(first_transform(obj))

私がよく使う例を挙げてみましょう

markdown(truncate(@post.content))

また

truncated_post = truncate(@post.content)
markdown(truncated_post)

あなたの性格にもよると思いますがtransform

于 2013-01-08T11:42:00.683 に答える