1

最近、私はこの方法を思いつきました:

module Enumerable
  def transform
    yield self
  end
end

メソッドの目的はメソッドに似てtapいますが、オブジェクトを変更する機能があります。

たとえば、このメソッドを使用すると、チェーン スタイルで配列の順序を変更できます。

array.do_something.transform{ |a| [a[3],a[0],a[1],a[2]] }.do_something_else

これを行う代わりに:

a0,a1,a2,a3 = array.do_something
result = [a3, a0, a1, a2].do_something_else

この方法を使うと他にも便利なところがありますが…

メソッドは非常に簡単なので、同じ目的で既に構築されているメソッドがどこかにあるはずです。

このルビーメソッドの類似物はありますか?

4

3 に答える 3

1

あなたはそれをすることができますinstance_eval

受信者のコンテキスト内で、指定されたブロックを評価(…)します

例:

%w(a b c d).instance_eval{|a| [a[3], a[0], a[1], a[2]] }
# => ["d", "a", "b", "c"]

または使用self

%w(a b c d).instance_eval{ [self[3], self[0], self[1], self[2]] }
# => ["d", "a", "b", "c"]
于 2012-06-28T14:29:51.197 に答える
1

私は今これをテストすることはできませんが、次のようなことができるはずです:

array= [1,2,3]
array.tap{ |a| a.clear } 

Tap はブロックを実行してから self を返すので、ブロック内で self を変更できる場合は、更新された配列が返されます。私の例では、clear はブロック内の自己を変更するため、変更された自己が返されます。

この機能が必要な場合は、do_something_else! のようなメソッドを追加することをお勧めします。それは自分自身を変更し、タップブロック内で実行します。

于 2012-06-28T14:24:20.220 に答える
0

では、質問はどこにありますか?それはすべて、関数型プログラミングの領域にどれだけ入りたいかによって異なります。読むだけLearn You a Haskell for Great Good!で、同じになることはありません。このPandoraボックスを開くと、停止するのは非常に難しく、いくつかの実験の後、私はまだRubyコードを書いているのだろうかと思います。比較(transformに対して定義されたメソッドを使用Object

h = {}
{:a => :a_method, :b => :b_method}.each do |k, m|
  h[k] = some_object.__send__(m)
end
h.some_other_method

some_object.transform(&THash[:a => :a_method, :b => :b_method]).some_other_method

どこ

THash = 
  lambda do |t| 
    h = {}
    kms = t.map { |k, v| [k, v.to_proc] }
    lambda do |x| 
      kms.each { |k, m| h[k] = m[x] }
    end
  end

したがって、変換の観点からオブジェクトを考えたい場合、それは完全に理にかなっており、コードを読みやすくしますが、それは単なるtransformメソッドではなく、頻繁に使用する一般的な変換を定義する必要があります。

基本的にはpoint-freeプログラミングと呼ばれますが、一部の人はそれを呼びますpointless。あなたの考え方に依存します。

于 2012-06-28T15:21:38.117 に答える