如何调用方法“< =>”?

时间:2016-02-23 16:00:15

标签: ruby class struct

如何调用方法“< =>”? 本书的任务。我知道它可以是“< =>。”我需要调用方法

Point = Struct.new(:x, :y)

class Point
  def add!(other)
    self.x += other.x
    self.y += other.y
    self
  end

  include Comparable
  def <=>(other)
    return nil unless other.instance_of? Point
    self.x**2 + self.y**2 <=> other.x**2 + other.y**2
  end
end

我创建了两个对象。

p, q = Point.new(1, 0), Point.new(0, 1)

2 个答案:

答案 0 :(得分:3)

在Ruby中,==+<=>等运算符只是方法。如果您愿意,可以像其他任何方法一样调用<=>方法:

class Foo
  def <=>(other)
    puts "Comparing #{inspect} to #{other.inspect}!"
    1
  end
end

obj = Foo.new
obj.<=>(9000)
# -> Comparing #<Foo:0x007fef1094b180> to 9000!"
# => 1

...但为了让我们都疯了,Ruby给了我们语法糖,让我们可以使用 infix 表示法来调用方法:

obj <=> 9000
# -> Comparing #<Foo:0x007fef1094b180> to 9000!"
# => 1

这两种形式是等价的。它们是调用<=>方法的两种不同方式。

当然,当我们说&#34;调用<=>方法&#34;在obj,我们的意思是&#34;将消息<=>发送到obj。&#34;另一种方法是使用send或其更安全的兄弟public_send

obj.public_send(:<=>, 9000)
# -> Comparing #<Foo:0x007fef1094b180> to 9000!"
# => 1

我只是为了演示而指出上述内容。不要在实际代码中这样做。只需使用其中缀形式调用该方法:

p <=> q

答案 1 :(得分:0)

正确的方法调用。特别针对此示例。

p.<=>(q)