gpt4 book ai didi

ruby - 为什么括号会改变返回值?

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



我正在学习 ruby ,但遇到了可能很简单的问题。有代码:

str = 'abc'
a = 1
b = 2
a = str.reverse if str.size > 3
b = (str.reverse if str.size > 3)
p a
p b

输出:

1
nil

有人能告诉我这些括号在返回值中发生了什么变化吗?
它是一种代码“ block ”吗?

最佳答案

这是两种不同的说法。

第一个是条件赋值:

a = str.reverse if str.size > 3

if 应用于整行。如果 str.size 不大于 3,则绝对不会发生任何事情; a 根本没有被触及。你也可以这样写:

if str.size > 3 then 
a = str.reverse
end

能够将 if 粘贴在末尾只允许您在一行而不是一个 block 中完成。

第二个是条件值的赋值。

b = (str.reverse if str.size > 3)

在这种情况下,b 的值将始终更改,无论如何; str.size 的值决定了它变成的内容。您还可以在此处使用 if 的 block 形式:

b = if str.size > 3 then 
str.reverse
end

重要的区别在于对b 的赋值发生在if 之外,因此它不是有条件的;它总是会发生。

圆括号不构成 block ,但它们确定优先级。每当你有一个可以根据事情发生的顺序以多种方式解释的陈述时,实际发生的事情是由优先规则决定的。例如,标准算术规则告诉我们这是真的:

3 + 2 × 4 = 11

答案不是 20,因为乘法优先于加法。括号让你改变它;以上等同于

3 + (2 × 4) = 11

如果你希望答案是 20,那么你可以这样写:

(3 + 2) × 4 = 20

Ruby 也是如此。没有括号,第一行等同于这个带括号的版本:

(a = str.reverse) if str.size > 3

这清楚地表明赋值是由条件保护的,而不仅仅是被赋值的值。

关于ruby - 为什么括号会改变返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798624/

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