Comparable <=> 在哪里实现?

Where is Comparable <=> implemented?

我正在阅读 Comparable module

并试图查看 Comparable 模块 本身 的实现位置,但我无法在任何地方找到它。 我只看到使用 include.

添加的地方

模块不是应该在其他地方提供它的实现吗?这样您就可以使用 include?

即插即用

或者是在下面的代码中:

class Geeksforgeeks
      
# include comparable module
include Comparable
attr :name
      
    def <=>(other_name) # LineA
        name.length <=> other_name.name.length # LineB
    end
      
    def initialize(name)
        @name = name
    end
end

LineA: 处于 Geeksforgeeks class 级别。

LineB: 是整数(长度)级别的东西。

如果是这样那么 <=> 在哪里写的整数?

编辑:

我的代码构建时没有 include Comparable。我只是不太确定这是什么意思:

class Geeksforgeeks
    
# does not include Comparable
attr :name
        
    def <=>(other_name) # LineA
        name.length <=> other_name.name.length # LineB
    end
        
    def initialize(name)
        @name = name
    end
end

jack = Geeksforgeeks.new('jack')
pete = Geeksforgeeks.new('pete')
alexander = Geeksforgeeks.new('Alexander')

def areSameGeeks(g1, g2)
    if g1 <=> g2
        puts 'equal'
    else 
        puts 'not equal'
    end
end

areSameGeeks(jack,pete) # equal
areSameGeeks(jack, jack) # equal
areSameGeeks(jack, alexander) # equal

喜欢为什么三个都是,返回'equal'?

<=> 未在 Comparable 模块中实现:

https://ruby-doc.org/core-3.1.1/Comparable.html

此操作在每个 Ruby 类型中实现(例如 - String, Array, Integer)。对于默认的 Ruby 类型,可以只比较相同类型的对象,如果您尝试将它与不同的对象进行比较,您将得到 nil 值。

在您的示例中,LineA 是 Geeksforgeeks class 对象的方法,因此您可以将其用作 gfg_object <=> other_gfg_object。顺便说一下,您对 <=> 的实现不太正确,它应该检查 other_nameGeekforgeeks class (或其他类型)和 [=30= 的实例] nil 如果不是。正确示例:

    def <=>(object)
        if object.is_a? Geekforgeeks
            return name.length <=> object.name.length
        elsif object.is_a? String
            return name.length <=>object.length
        else 
            return nil
        end
    end

And trying to see where Comparable module itself is implemented, but I can’t find it anywhere.

Comparable 是您正在使用的任何 Ruby 实现的核心库的一部分。例如:

但是,我个人觉得 实现 的地方并不有趣,而 指定的 更有趣。 ComparableISO/IEC 30170:2012 Information technology — Programming languages — Ruby specification. A less formal specification is given in core/comparable/ of The Ruby Spec Suite aka ruby/spec.

的第 15.3.3 Comparable 节中指定

The Ruby Programming Language by David Flanagan and Yukihiro 'matz' Matsumoto, Programming Ruby by Dave Thomas, Andy Hunt, and Chad Fowler, and of course in the Ruby documentation

中也有描述

If that's the case then where is <=> written for Integers?

Integer#<=> 是您正在使用的任何 Ruby 实现的核心库的一部分。例如:

但是,我个人觉得 实现 的地方并不有趣,而 指定的 更有趣。 Integer#<=>在ISO/IEC30170:2012信息技术-程序设计第15.2.8.3.6节Integer#<=>中指定语言 — Ruby 规范。 Ruby Spec Suite aka ruby/spec.

core/integer/comparison_spec.rb 给出了一个不太正式的规范

David Flanagan 和 Yukihiro 'matz' Matsumoto 在 The Ruby Programming Language 中也有描述,Programming Ruby 作者 Dave Thomas、Andy Hunt 和 Chad Fowler,当然还有 Ruby documentation.

一个示例可能有助于理解 Comparable 的工作原理:

module MyComparable
  def ==(other)
    (self <=> other) == 0
  end

  def <(other)
    (self <=> other) < 0
  end

  def >(other)
    (self <=> other) > 0
  end
end

上述模块定义了方法==<>。它们的实现依赖于模块未定义的另一种方法 <=>

要实际使用模块的方法,包含 class 必须以有意义的方式提供此 <=>,例如:

class Foo
  include MyComparable   # <- this adds its instance methods to Foo

  attr_reader :name

  def initialize(name)
    @name = name
  end

  def <=>(other)
    name.length <=> other.name.length
  end
end

这给了我们:

Foo.new("abc") == Foo.new("123")  #=> true
Foo.new("abc") == Foo.new("1234") #=> false
Foo.new("abc") <  Foo.new("1234") #=> true

==< 来自 MyComparable,但它只适用于 Foo#<=>.

Enumerable 采用了类似的方法,它需要 each 方法由包含的 class.

实现