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_name
是 Geekforgeeks
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 实现的核心库的一部分。例如:
- 在Rubinius,
Comparable
is implemented in core/comparable.rb
,
- 在TruffleRuby, it is implemented in
src/main/ruby/truffleruby/core/comparable.rb
,
- 在MRuby, it is implemented in
mrblib/compar.rb
,
- 在Opal, it is implemented in
opal/corelib/comparable.rb
,
- 在JRuby, it is implemented in
core/src/main/java/org/jruby/RubyComparable.java
,
- 在 IronRuby, it is implemented in
Src/Libraries/Builtins/Comparable.cs
和
- 在YARV, it is implemented in
compar.c
.
但是,我个人觉得 实现 的地方并不有趣,而 指定的 更有趣。 Comparable
在 ISO/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 实现的核心库的一部分。例如:
- 在Rubinius中,
Integer#<=>
在core/integer.rb
、 中实现
- 在TruffleRuby中实现,在
src/main/java/org/truffleruby/core/numeric/IntegerNodes.java
, 中实现
- 在MRuby中实现,在
src/numeric.c
which delegates to cmpnum
, 中实现
- 在 Opal 中,它在技术上不存在(这是 Opal 不符合 Ruby 语言规范的少数情况之一)因为 Opal 没有 Ruby
Float
s 或 Integer
s,它只有 ECMAScript number
s;对于那些,Number#<=>
在 opal/corelib/number.rb
、 中实现
- 在JRuby,
Integer
是一个抽象class,所以它在core/src/main/java/org/jruby/RubyInteger.java
, the actual implementations are in the two subclasses Fixnum
(core/src/main/java/org/jruby/RubyFixnum.java#L1043-L1060
) and Bignum
(core/src/main/java/org/jruby/RubyBignum.java
),[=112中只有Integer#<=>
的声明=]
- 在 IronRuby 中,它在
Src/Libraries/Extensions/ClrInteger.cs
(at least for Integer
s that fit into a C# int
) and just delegates to C#'s int.CompareTo
中实现,并且
- 在YARV中,实现在
numeric.c
and delegates to either fix_cmp
or big_cmp
(defined in bignum.c
).
但是,我个人觉得 实现 的地方并不有趣,而 指定的 更有趣。 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.
实现
我正在阅读 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_name
是 Geekforgeeks
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 实现的核心库的一部分。例如:
- 在Rubinius,
Comparable
is implemented incore/comparable.rb
, - 在TruffleRuby, it is implemented in
src/main/ruby/truffleruby/core/comparable.rb
, - 在MRuby, it is implemented in
mrblib/compar.rb
, - 在Opal, it is implemented in
opal/corelib/comparable.rb
, - 在JRuby, it is implemented in
core/src/main/java/org/jruby/RubyComparable.java
, - 在 IronRuby, it is implemented in
Src/Libraries/Builtins/Comparable.cs
和 - 在YARV, it is implemented in
compar.c
.
但是,我个人觉得 实现 的地方并不有趣,而 指定的 更有趣。 Comparable
在 ISO/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
.
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 实现的核心库的一部分。例如:
- 在Rubinius中,
Integer#<=>
在core/integer.rb
、 中实现
- 在TruffleRuby中实现,在
src/main/java/org/truffleruby/core/numeric/IntegerNodes.java
, 中实现
- 在MRuby中实现,在
src/numeric.c
which delegates tocmpnum
, 中实现
- 在 Opal 中,它在技术上不存在(这是 Opal 不符合 Ruby 语言规范的少数情况之一)因为 Opal 没有 Ruby
Float
s 或Integer
s,它只有 ECMAScriptnumber
s;对于那些,Number#<=>
在opal/corelib/number.rb
、 中实现
- 在JRuby,
Integer
是一个抽象class,所以它在core/src/main/java/org/jruby/RubyInteger.java
, the actual implementations are in the two subclassesFixnum
(core/src/main/java/org/jruby/RubyFixnum.java#L1043-L1060
) andBignum
(core/src/main/java/org/jruby/RubyBignum.java
),[=112中只有Integer#<=>
的声明=] - 在 IronRuby 中,它在
Src/Libraries/Extensions/ClrInteger.cs
(at least forInteger
s that fit into a C#int
) and just delegates to C#'sint.CompareTo
中实现,并且 - 在YARV中,实现在
numeric.c
and delegates to eitherfix_cmp
orbig_cmp
(defined inbignum.c
).
但是,我个人觉得 实现 的地方并不有趣,而 指定的 更有趣。 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.