如果存在方法==
,则会定义方法!=
以获取该结果并将!
应用于该方法。 (可能还有=~
和!~
。)
与此不同,>=
(通常表示>
或==
)实际上独立于>
和==
。这两种定义似乎都不会影响其他定义(与<=
,<
,==
类似。他们为什么设计独立?
编辑 Broi Satse指出,在继承Comparable
的类中,确实存在这种关系。所以我的问题将得到重申:为什么这种关系仅适用于这些类?您希望何时(在非Comparable
班级中)让>=
独立于>
和==
工作?
答案 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)
)