gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:49 24 4
gpt4 key购买 nike

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

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

但是,如果我想避免使用“宇宙飞船”(<=>) 运算符,我会直觉地认为我可以执行以下操作,但是当我在 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 上的类(class)。

最佳答案

return 从方法返回。它只能在方法内部使用。你的代码中没有方法,因此你得到一个错误......即使有一个方法,代码也不会做你想做的,因为 return 从方法,而不是 block 。

要从 block 中返回值,请使用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 中,一切 都是表达式,没有 语句。)这意味着一切,包括条件表达式,都会返回一个值。对于 if/then/else,返回的值是来自分支的值。

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

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

并且由于 block 的返回值(就像方法的返回值一样)隐含地是 block 内计算的最后一个值,我们可以说:

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

next 主要用于以保护子句样式在 block 的早期跳出或展平深度嵌套的条件:

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
}

关于ruby - .sort 中组合比较运算符 (<=>) 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25196531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com