gpt4 book ai didi

ruby - 为什么 `puts(nil or 4)` 在 Ruby 中失败?

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

当我这样做时:

puts(nil or 4)

Ruby 提示:

SyntaxError: syntax error, unexpected keyword_or, expecting ')'

这是为什么呢? puts(nil || 4) 确实有效,但我想知道为什么 没有。我认为两者之间的区别仅在于它们的运算符优先级。

(我知道表达式 nil or 4 似乎没有用,因为它总是返回 4。为了简单起见,这只是一个例子。我的实际表达式是整数(ENV['WD'] 或 4)。)

最佳答案

简答

因为这就是 ruby​​ 语法。

更长的答案

and/or 关键字被设计用于控制流结构。考虑这个例子:

def die(msg)
puts "Exited with: #{msg}"
end

def do_something_with(arg)
puts arg
end

do_something_with 'foo' or die 'unknown error'
# >> foo
# >> Exited with: unknown error

此处 or 可以很好地与 ruby​​ 的可选括号配合使用,因为 ruby​​ parsing rules (pseudo-BNF) .

简而言之,一个参数列表(CALL_ARGS)就是一个ARG的列表,用逗号分隔。现在,大多数东西都是 ARG(类定义,例如,通过成为 PRIMARY),但不是朴素的 EXPR。如果用括号括起一个表达式,那么它将匹配“复合语句”的规则,因此将是一个 PRIMARY,它是一个 ARG。这意味着什么

puts( (nil or 4) ) # will work, compound statement as first argument
puts (nil or 4) # same as above, omitted optional method call parentheses
puts(nil or 4) # will not work, EXPR can't be an argument
puts nil or 4 # will work as `puts(nil) or 4`

您可以阅读上面引用的语法以准确地理解它是如何工作的。

奖励:类定义是有效 ARG 的示例

puts class Foo
def bar
puts "hello"
end
end, 'second argument'

# >> bar # this is the "value" of the class definition
# >> second argument

关于ruby - 为什么 `puts(nil or 4)` 在 Ruby 中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37613287/

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