【问题标题】:alternative to combined comparison operator (<=>) in .sort.sort 中组合比较运算符 (<=>) 的替代方案
【发布时间】:2014-08-08 05:25:10
【问题描述】:

我知道如果我想按降序对数组进行排序,我必须执行以下操作:

array.sort!{|a,b| b <=> a}

但是,如果我想避免使用“spaceship”() 运算符,我会直觉地认为我可以执行以下操作,但是当我在 repl.it 上运行它时收到错误消息:

array.sort!{|a, b| 
    if b < a 
        return -1
    elsif b > a
        return 1
    else
        return 0 
    end
}

错误是这样的:

(eval):4: (eval):4: unexpected return (LocalJumpError)
from (eval):0:in `sort!'
from (eval):0

有人请帮帮我!

附:我对 Ruby 很陌生。我只是在学习 Codecademy 的课程。

【问题讨论】:

    标签: ruby spaceship-operator


    【解决方案1】:

    return 从方法返回。它只能在方法内部使用。您的代码中没有方法,因此您会收到错误……即使有 个方法,代码也不会执行您想要的操作,因为 return 从方法返回,而不是块。

    要从块中返回值,请使用next

    array.sort! {|a, b| 
      if b < a 
        next -1
      elsif b > a
        next 1
      else
        next 0 
      end
    }
    

    但是,与 C 不同,if/then/else 在 Ruby 中是一个表达式,而不是一个语句。 (实际上,everything 在 Ruby 中是一个表达式,有 no 语句。)这意味着一切,包括条件表达式,都会返回一个值。对于if/then/else,返回的值是来自被采用的分支的值。

    所以,我们可以只返回整个if表达式的vlue,而不是分别从每个分支返回:

    array.sort! {|a, b| 
      next if b < a 
        -1
      elsif b > a
        1
      else
        0 
      end
    }
    

    而且由于块的返回值(就像方法的返回值一样)隐含地是块内评估的最后一个值,我们可以说:

    array.sort! {|a, b| 
      if b < a 
        -1
      elsif b > a
        1
      else
        0 
      end
    }
    

    next 主要用于在保护子句样式中提前中断块或扁平化深度嵌套的条件:

    array.sort! {|a, b| 
      next -1 if b < a 
      next  1 if b > a
            0 
    }
    

    请注意,case 可能比if 更合适:

    array.sort! {|a, b| 
      case
      when b < a 
        -1
      when b > a
        1
      else
        0 
      end
    }
    

    【讨论】:

      【解决方案2】:

      删除单词return,使您的代码看起来像

      array.sort!{|a, b| 
        if b < a 
          -1
        elsif b > a
          1
        else
          0 
        end
      }
      

      【讨论】:

      • 为什么会这样呢?你不是在技术上“返回”这些值吗?
      • return 中断迭代。
      • 啊。除了整个 if/elsif/else 只是块权的一部分。因此,该块与其说是函数,不如说是 .sort 方法的语法——告诉它如何处理“a”和“b”这两个元素,对吗?
      • 差不多。在网上搜索“proc vs block vs lambda”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2019-01-14
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多