为什么`< =`和`> =`与`<`,`>`和`==`无关?

时间:2015-12-13 13:01:28

标签: ruby

如果存在方法==,则会定义方法!=以获取该结果并将!应用于该方法。 (可能还有=~!~。)

与此不同,>=(通常表示>==)实际上独立于>==。这两种定义似乎都不会影响其他定义(与<=<==类似。他们为什么设计独立?

编辑 Broi Satse指出,在继承Comparable的类中,确实存在这种关系。所以我的问题将得到重申:为什么这种关系仅适用于这些类?您希望何时(在非Comparable班级中)让>=独立于>==工作?

4 个答案:

答案 0 :(得分:5)

ruby​​中有一个名为Comparable(http://ruby-doc.org/core-2.2.3/Comparable.html)的模块,它实现了依赖单个方法var obj = {}; obj.text = "Hello!!!"; obj.sayHello = function(){alert("hi!");}; var angularTemplate = $interpolate(template)(obj); 的所有方法。

<=>

由于Comparable方法仅依赖于class A include Comparable def initialize(a) @a = a end def <=>(other) @a <=> other.a end protected def a @a end end a = A.new(1) b = A.new(3) a < b ,因此重新定义<=>不会影响任何其他方法(因为其他任何方法都不依赖于其实现)。

答案 1 :(得分:4)

如果某个课程不是>=,那么它就意味着所说的内容,它通常无法比较。

在某些奇特的情况下,您可能会以>不代表==@Echo Off Setlocal EnableDelayedExpansion dir "D:/Source" /b > List.txt FOR /F %%i in (List.txt) DO ( CALL:Alpha Numb echo !Numb! md D:\Output\%%~ni rar a -v50M -hpabc123 -m0 -ep "D:\Output\%%~ni\!Numb!.rar" "D:\Source\%%i" ) goto:eof :Alpha Setlocal EnableDelayedExpansion Set _RNDLength=40 Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 Set _Str=%_Alphanumeric%987654321 :_LenLoop IF NOT "%_Str:~18%"=="" SET _Str=%_Str:~9%& SET /A _Len+=9& GOTO :_LenLoop SET _tmp=%_Str:~9,1% SET /A _Len=_Len+_tmp Set _count=0 SET _RndAlphaNum= :_loop Set /a _count+=1 SET _RND=%Random% Set /A _RND=_RND%%%_Len% SET _RndAlphaNum=!_RndAlphaNum!!_Alphanumeric:~%_RND%,1! If !_count! lss %_RNDLength% goto _loop REM Echo %_RndAlphaNum% ENDLOCAL & SET "%~1=%_RndAlphaNum%" Exit /b 的方式重载运算符,但是例如 - 是一个从通道读取消息的运算符容器

答案 2 :(得分:2)

在我看来,你在问我们为什么没有:

class Object
  def <=(other)
    self < other || self == other
  end
  def >=(other)
    self > other || self == other
  end
end

Object#<=类的实例使用K要求<K的祖先之一K定义Object#>=。当然,<=>也是如此。

如果存在实例的基础总排序(在这种情况下可以定义<),我认为没有任何优势:a)定义>Object和我一样修改<=>,b)在类上定义Comparable(除非它尚未定义)并将<混合到类中。

如果没有总排序,仍然可以定义>和/或<=>,但Comparable不能,因此<=不能混入。如果{ {1}}和/或>=是必需的,并且要按照上面的定义进行定义,在Object完成后会很方便。

以下是在未建立总排序的类上定义<>的示例:

class Range
  def <(other)
    first < other.first
  end
  def >(other)
    last > other.last
  end
end

r1 = (1..10)
r2 = (3..6)

r1 < r2  #=> true
r1 > r2  #=> true

如果已将这两种方法添加到Object

r1 <= r1 #=> true
r1 >= r1 #=> true

如果需要<=中的>=和/或Object以外的其他内容,那么这些方法当然可以在Range中覆盖。

我认为在无法定义<的情况下,有可能需要在自定义类上定义>和/或<=>。在这些情况下,在Object中使用这两种方法可能会很方便。

请注意,如果方法已添加到Object,则只要混入Comparable,就会覆盖这些方法。

答案 3 :(得分:1)

  

您希望(在非Comparable类中)何时具有&gt; =工作   独立于>和==?

例如,如果您不打算将它们用于比较。毕竟它们只是方法名[1],没有人阻止你将它们用于你想要的任何目的。

[1]虽然它们是方法名称,解析器对其“加糖”表单的处理方式有所不同(例如foo < bar而不是foo.<(bar)