【问题标题】:Why do we need spaceship operator? [duplicate]为什么我们需要宇宙飞船操作员? [复制]
【发布时间】:2015-08-26 10:43:18
【问题描述】:

如果我们有<>==,则总顺序由它们决定。为什么我们需要<=>

【问题讨论】:

  • 查看@AndreyDeineko 提供的链接中的第二个答案。通过实现<=> 并包含Comparable 模块,您可以获得各种好东西。
  • @pjs,就出现顺序而言,SO 问题的答案不回复<=>。 :-)
  • @CarySwoveland 应该说第二受欢迎...

标签: ruby


【解决方案1】:

此运算符有时称为“signum”函数。它提供了最简洁的方式来自定义排序顺序。例如:

require "ostruct"

# Fake "rows" with OpenStructs
my_data = [
    OpenStruct.new({ :name => "Ben", :age => 50 }),
    OpenStruct.new({ :name => "Abe", :age => 50 }),
    OpenStruct.new({ :name => "Cab", :age => 51 })
]

# Sort by age descending, then name ascending
puts my_data.sort { |a, b| 2 * (b.age <=> a.age) + (a.name <=> b.name) }

这是可行的,因为来自&lt;=&gt; 的值始终为 -1、0 或 1。我不知道进行通用排序的更有效方法。

【讨论】:

    【解决方案2】:

    &lt;=&gt;Comparable 的基础,因此您不必自己实现所有比较功能。只实现一个功能而不是三个功能更容易且不易出错。

    【讨论】:

      【解决方案3】:

      &lt;==&gt;&lt;=&gt; 之间存在冗余是正确的。事实上,当&lt;==&gt;被定义时,&lt;=&gt;就被自动定义了。

      【讨论】:

        【解决方案4】:

        我们不需要需要&lt;=&gt;

        a<=>b
        

        相当于:

        if a<b
          return -1
        elsif a>b 
          return 1
        else
          return 0
        end
        

        为了方便起见,它取自 perl。

        【讨论】:

        • 我不明白你的意思。我们当然需要方法&lt;=&gt;,因为其他内置方法都依赖它。是的,&lt;=&gt; 的结果可以通过其他方式获得,但几乎所有内置方法都可以这样说。
        • @CarySwoveland 我明白你的意思。我理解这个问题的方式,OP 对 &lt;=&gt; 做了什么感到困惑。对我来说,他的印象似乎是 让你做一些你不能用 &lt;&gt;= 做的事情。这是我选择措辞的前提。
        • @CarySwoveland 我的意思不是“不需要”就像我们“不需要”or 因为我们有not + and
        • @CarySwoveland 我认为 LukeP 的意思是“我们不需要 [明确定义] &lt;=&gt; [鉴于已定义 &lt;==&gt;]。”跨度>
        【解决方案5】:

        “宇宙飞船”运算符用于比较,而不是平等。它在概念上类似于 C 的 strcmp 函数。

        来自String 类:

        string &lt;=&gt; other_string → -1、0、+1 或无

        Comparison — 根据 string 是否小于、等于或大于 other_string 返回 -1、0、+1 或 nil。

        简而言之,== 返回一个表示相等的布尔值,而&lt;=&gt; 返回一个表示比较值的数字。如果第一个对象的价值大于第二个,&lt;=&gt; 返回+1。如果它的值较小,则返回-1。如果两者的值相同,则返回0

        对象的“价值”可以定义为几乎任何东西。但是,对于 String&lt;=&gt; 会检查两个参数的 lexicographic ordering

        因此:

        "abc" == "abc" # true
        ("abc" <=> "abc") == 0 # true
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-22
          • 2021-01-07
          • 2011-01-30
          • 1970-01-01
          • 2010-10-24
          • 2015-08-02
          • 2015-08-02
          相关资源
          最近更新 更多