Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中if/除非语句的隐式值_Ruby - Fatal编程技术网

ruby中if/除非语句的隐式值

ruby中if/除非语句的隐式值,ruby,Ruby,我是Ruby的新手,正在努力理解这一点的原因(它似乎确实起作用,至少根据: 我关心的是,当数组包含非fixnum值时,“false ness”从何而来。除非语句,否则我假设语句中没有隐含的“else false”对吗?在这种情况下,我假设它一定来自Enumerable#find返回的nil值。对吗 如果是这样的话,这似乎有点动摇。像这样显式返回false是否更好 array.find { |item| item.class != Fixnum } ? false : true 还有其他更好的方

我是Ruby的新手,正在努力理解这一点的原因(它似乎确实起作用,至少根据:

我关心的是,当数组包含非fixnum值时,“false ness”从何而来。除非语句,否则我假设
语句中没有隐含的“
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
的错误性和not
nil
的真实性来发挥作用。考虑如果您的方法通过<代码> [ 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
的错误性和not
nil
的真实性来发挥作用。考虑如果您的方法通过<代码> [ 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的基本原则之一是每个语句都必须返回一个值(即最后计算的表达式)。因此