ruby中if/除非语句的隐式值
我是Ruby的新手,正在努力理解这一点的原因(它似乎确实起作用,至少根据: 我关心的是,当数组包含非fixnum值时,“false ness”从何而来。除非语句,否则我假设ruby中if/除非语句的隐式值,ruby,Ruby,我是Ruby的新手,正在努力理解这一点的原因(它似乎确实起作用,至少根据: 我关心的是,当数组包含非fixnum值时,“false ness”从何而来。除非语句,否则我假设语句中没有隐含的“else false”对吗?在这种情况下,我假设它一定来自Enumerable#find返回的nil值。对吗 如果是这样的话,这似乎有点动摇。像这样显式返回false是否更好 array.find { |item| item.class != Fixnum } ? false : true 还有其他更好的方
语句中没有隐含的“else false
”对吗?在这种情况下,我假设它一定来自Enumerable#find
返回的nil
值。对吗
如果是这样的话,这似乎有点动摇。像这样显式返回false
是否更好
array.find { |item| item.class != Fixnum } ? false : true
还有其他更好的方法吗?感谢您帮助我了解这一点,并提供任何“最佳实践”建议。来自“查找方法”文档:
Passes each entry in enum to block. Returns the first for which block is not false. If no object matches, calls ifnone and returns its result when it is specified, or returns nil otherwise.
因此,您只需要:
def array_of_fixnums?(array)
array.find { |item| item.class != Fixnum }
end
如果找到任何内容,将返回该内容,否则将返回nil,并且该方法将计算do false
但是,由于项目返回可能是false
或nil
(如果列表中的任何项目为false或nil),我建议您改用.any?
方法
def array_of_fixnums?(array)
array.any? { |item| item.class != Fixnum }
end
从查找方法文档:
Passes each entry in enum to block. Returns the first for which block is not false. If no object matches, calls ifnone and returns its result when it is specified, or returns nil otherwise.
因此,您只需要:
def array_of_fixnums?(array)
array.find { |item| item.class != Fixnum }
end
如果找到任何内容,将返回该内容,否则将返回nil,并且该方法将计算do false
但是,由于项目返回可能是false
或nil
(如果列表中的任何项目为false或nil),我建议您改用.any?
方法
def array_of_fixnums?(array)
array.any? { |item| item.class != Fixnum }
end
您的方法返回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
的错误通常会起作用,但问题在于它没有遵循最小意外的原则。?
方法应返回true或false
但是你的方法有更糟糕的问题。它使用令人困惑的逻辑(双重否定),其本身依赖于nil
的错误性和notnil
的真实性来发挥作用。考虑如果您的方法通过<代码> [ false ] < /代码>会发生什么。哎呀
更好的方法是:
array.all? {|n| n.is_a? Fixnum }
理由是这种方法确实做到了它所说的,很明显
显式返回布尔值虽然不一定是错误的,但这是多余的,通常被认为是不好的做法。而是考虑这个例子,在Ruby Salk中,这个数组中的每个值都是FixNUM。该表达式的结果就是该方法所追求的结果;没有理由评估它然后返回true | false
您的方法返回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
的错误通常会起作用,但问题在于它没有遵循最小意外的原则。?
方法应返回true或false
但是你的方法有更糟糕的问题。它使用令人困惑的逻辑(双重否定),其本身依赖于nil
的错误性和notnil
的真实性来发挥作用。考虑如果您的方法通过<代码> [ false ] < /代码>会发生什么。哎呀
更好的方法是:
array.all? {|n| n.is_a? Fixnum }
理由是这种方法确实做到了它所说的,很明显
显式返回布尔值虽然不一定是错误的,但这是多余的,通常被认为是不好的做法。而是考虑这个例子,在Ruby Salk中,这个数组中的每个值都是FixNUM。该表达式的结果就是该方法所追求的结果;没有理由评估它,然后返回true | false
让我们看看为什么为true,除非条件
像它那样工作
我相信x,除非条件是作为x的美学改进提供的,如果!条件
,但两者是等效的(在我看来,这是一种改进)。为了消除双重否定,如果条件> ,我将考虑<代码> x。
Ruby的基本原则之一是每个语句都必须返回一个值(即最后计算的表达式)。因此,x if条件
必须计算为if条件然后x else y结束
。但是什么是y
?如果y
计算为true
或false
,x如果条件
是布尔表达式,则x如果条件
将毫无意义。要了解原因,请考虑:
w = (x == 5 if z == 6)
如果w
为真,我们可以得出x=5
和z=6
的结论,但如果w
为假,我们就不知道z=6
和x!=5
,或z!=6
和x=5
或x!=5
。考虑到除nil
以外的y
的任何值都被评估为true
或false
,因此y
的唯一合理值是nil
。这样,如果w==nil
可用,。当然,当x
可能是nil
时,这仍然是一个问题(在其他情况下)
我欢迎作出澄清和阐述。也许还有一种不那么复杂的方法来证明这个论点。让我们看看为什么为真,除非条件像它那样工作
我相信x,除非条件是作为x的美学改进提供的,如果!条件
,但两者是等效的(在我看来,这是一种改进)。为了消除双重否定,如果条件> ,我将考虑<代码> x。
Ruby的基本原则之一是每个语句都必须返回一个值(即最后计算的表达式)。因此