3

連鎖可能なメソッドとして使用した場合に同じ動作をするように「<<」を実装するにはどうすればよいですか?

class Test
  attr_accessor :internal_array

  def initialize
    @internal_array = []
  end

  def <<(item)
    @internal_array << :a
    @internal_array << item
  end
end

t = Test.new
t << 1
t << 2
t << 3
#t.internal_array => [:a, 1, :a, 2, :a, 3]
puts "#{t.internal_array}" # => a1a2a3

t = Test.new
t << 1 << 2 << 3
#t.internal_array => [:a, 1, 2, 3]
puts "#{t.internal_array}" # => a123 , Why not a1a2a3?

どちらの場合も同じ結果が得られるようにしたいと思います。

4

2 に答える 2

4

self<<メソッドの最後の行として追加して返します。現状では、インスタンスではなく、暗黙的に配列を返しています。

于 2010-07-30T20:27:14.880 に答える
0

上記の答えの説明:

メソッドがチェーンされると、次のメソッドが最初のメソッドの結果に適用されます。

例の場合:

class A
  def method1
    B.new
  end
end

class B
  def method2
    C.new
  end
end

class C
  def method3
    puts "It is working!!!"
  end
end

以下のコードは機能します

A.new.method1.method2.method3

しかし、これはしません

A.new.method1.method3.method2

A.new.method1の結果であるクラスBのインスタンスは、method3を実装していないためです。これは同じです:

(((A.new).method1).method3).method2

上記の質問で使用されたコードは、TestとArrayの両方にメソッド<<があったため、もう少しトリックでした。しかし、返される@internal_arrayではなく、Test#<<が自分自身を返すようにしたいのです。

于 2010-07-30T21:16:19.883 に答える