你可以像这样比较两个数组。
p ([1, 2] <=> [1, 3]) < 0 # [1, 2] < [1, 3] p ([1, 2] <=> [1, 3]) > 0 # [1, 2] > [1, 3] p ([1, 2] <=> [1, 3]) == 0 # [1, 2] == [1, 3]
字符串我想知道为什么没有像>,<等操作符。这是不是一个有意的设计?如果是的话,它的历史是什么?
>
<
5cnsuln71#
我的五分钱评论:当您使用数组作为数据结构(如优先级队列(堆))的键时,数组比较非常有用。在这种情况下,我宁愿有一个明确的逻辑。举例来说:
class Key attr_reader :array def initialize(array) @array = array end def <(other) (array <=> other.array) < 0 end def >(other) (array <=> other.array) > 0 end def ==(other) (array <=> other.array) == 0 end end key1 = Key.new([1, 2]) key2 = Key.new([1, 3]) p key1 < key2 p key1 > key2 p key1 == key2
字符串
0kjbasz62#
我是根据Stefan提供的信息回答我自己的问题。这是Ruby的原作者Matz有意设计的。通过按字典顺序比较元素来比较两个数组是一个自然而有用的想法。但它们并不总是可比的,就像这个例子。
p [1, 2] <=> [1, 'x'] # This returns nil, because you can't compare 2 and 'x'.
字符串Matz担心提供普通的比较运算符会给予人一种错误的印象,即数组总是可比较的。但他不能完全给予比较数组,并提供了特殊的<=>运算符。您可以在Feature#5574 - Make arrays Comparative(使阵列具有可比性)中阅读他对相关功能请求的回答。因此,设计决定是一个固执己见的决定,而不是一个技术决定。以我的拙见,如果提供普通的操作符,当数组不具有可比性时引发异常,这将更加一致。(我是Ruby和Python的粉丝。
<=>
2条答案
按热度按时间5cnsuln71#
我的五分钱评论:
当您使用数组作为数据结构(如优先级队列(堆))的键时,数组比较非常有用。
在这种情况下,我宁愿有一个明确的逻辑。举例来说:
字符串
0kjbasz62#
我是根据Stefan提供的信息回答我自己的问题。
这是Ruby的原作者Matz有意设计的。通过按字典顺序比较元素来比较两个数组是一个自然而有用的想法。但它们并不总是可比的,就像这个例子。
字符串
Matz担心提供普通的比较运算符会给予人一种错误的印象,即数组总是可比较的。但他不能完全给予比较数组,并提供了特殊的
<=>
运算符。您可以在Feature#5574 - Make arrays Comparative(使阵列具有可比性)中阅读他对相关功能请求的回答。因此,设计决定是一个固执己见的决定,而不是一个技术决定。以我的拙见,如果提供普通的操作符,当数组不具有可比性时引发异常,这将更加一致。(我是Ruby和Python的粉丝。