Ruby 可链接方法/数组

发布于 2024-09-12 08:57:22 字数 565 浏览 2 评论 0原文

如何实现“<<”用作可链接方法时具有相同的行为吗?

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?

我希望这两种情况给出相同的结果。

How do I implement the '<<' to have the same behavior when used as a chainable method?

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?

I want both cases giving the same result.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

权谋诡计 2024-09-19 08:57:22

添加 self 作为 << 中的最后一行方法来返回它。事实上,您隐式返回数组,而不是实例。

Add self as the last line in the << method to return it. As is, you're implicitly returning the array, not the instance.

夏末的微笑 2024-09-19 08:57:22

上面答案的解释:

当一个方法被链接时,下一个方法将应用于第一个方法的结果。

例如:

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

,但 this 不会,

A.new.method1.method3.method2

因为类 B 的实例(A.new.method1 的结果)没有实现 method3。这与以下内容相同:

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

上面问题中使用的代码有一点技巧,因为 Test 和 Array 都有方法 <<。但我想要测试#<<返回 self,而不是返回的 @internal_array。

Explanation of the answer above:

When a method is chained, the next method is applied to the result of the first method.

For exemplo:

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

The code below will work

A.new.method1.method2.method3

but the this will not

A.new.method1.method3.method2

because an instance of class B, which is the result of A.new.method1 doesn't implement method3. This is the same of:

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

The code used in the question above, was a little bit more trick, because both, Test and Array had the method <<. But I want Test#<< to return self, and not the @internal_array that was being returned.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文