gpt4 book ai didi

ruby - ruby 中 if/unless 语句的隐式值

转载 作者:太空宇宙 更新时间:2023-11-03 17:53:10 27 4
gpt4 key购买 nike

我是 Ruby 的新手,并试图理解为什么它有效(它似乎确实如此,至少根据 "the Master" ):

def array_of_fixnums?(array)
true unless array.find { |item| item.class != Fixnum }
end

我担心的是,当数组包含非固定数值时,“虚假性”从何而来。我是否可以假设 unless 语句中没有隐含的“else false”?在那种情况下,我假设它必须来自 Enumerable#find 返回的 nil 值。对吗?

如果是这样,那似乎有点不稳定。像这样显式返回 false 会更好吗?

array.find { |item| item.class != Fixnum } ? false : true

还有其他更好的方法吗?感谢您帮助我解决这个问题,并提供任何“最佳实践”建议。

最佳答案

您的方法正在返回 nil不是因为 find返回 nil ,但是因为如果您的内联条件没有通过,则该方法没有明确的返回值。如果它不是内联的,这会更清楚,考虑:

def array_of_fixnums?(array)
unless array.find { |item| item.class != Fixnum }
return true
end
# otherwise don't explicitly return (implicit nil)
end

同时依赖于 nil 的虚假性通常会工作,但它的问题在于它没有遵循最小惊奇原则。 ?方法应该返回真或假。

但是你的方法有更严重的问题。它使用令人困惑的逻辑(双重否定),本身依赖于nil的虚假性。和的真实性nil , 发挥作用。考虑如果您的方法通过 [false] 会发生什么.糟糕。

更好的方法是这样的:

array.all? {|n| n.is_a? Fixnum }

理由是这个方法完全按照它说的做,很明显。

显式返回 bool 值虽然不一定是错误的,但却是多余的并且通常被认为是不好的做法。而是考虑这个示例,,用 ruby​​ 语言来说,这个数组中的每个值都是 Fixnum 吗?那个表达式的结果就是这个方法的结果;没有理由评估它然后返回 true|false .

关于ruby - ruby 中 if/unless 语句的隐式值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037418/

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