替代.sort中的组合比较运算符(< =>)

时间:2014-08-08 05:25:11

标签: ruby spaceship-operator

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

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

但是,如果我想避免使用“太空船”(&lt; =&gt;)运算符,我会直觉地认为我可以执行以下操作,但是当我在repl.it上运行它时收到错误:< / p>

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

有人请帮助我!

P.S。我是Ruby的新手。我正在阅读关于Codecademy的课程。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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中的表达式,而不是语句。 (实际上,所有是Ruby中的表达式,有 no 语句。)这意味着包括条件表达式在内的所有内容都返回一个值。对于if / then / else,返回的值是从分支中获取的值。

因此,我们不是单独从每个分支返回,而是返回整个if表达式的线索:

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
}