为什么Ruby有“Array#< =>”而没有“Array#< "?

zi8p0yeb  于 2023-08-04  发布在  Ruby
关注(0)|答案(2)|浏览(131)

你可以像这样比较两个数组。

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]

字符串
我想知道为什么没有像><等操作符。这是不是一个有意的设计?如果是的话,它的历史是什么?

5cnsuln7

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

字符串

0kjbasz6

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的粉丝。

相关问题