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 都有方法 <<。但我希望 Test#<< 返回 self,而不是返回的 @internal_array。

于 2010-07-30T21:16:19.883 回答