我知道如果我想按降序对数组进行排序,我必须执行以下操作:
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的课程。
答案 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
}