Ruby 为什么额外的括号在这段代码中起作用?
1括号:Ruby 为什么额外的括号在这段代码中起作用?,ruby,Ruby,1括号: print ( (1..10).collect do |x| x**2 end ) SyntaxError: compile error 更多详情: (irb):1: syntax error, unexpected kDO_BLOCK, expecting ')' print ( (1..10).collect do |x| x**2 end ) ^ (irb):1: syntax error, unexpected kEND,
print ( (1..10).collect do |x| x**2 end )
SyntaxError: compile error
更多详情:
(irb):1: syntax error, unexpected kDO_BLOCK, expecting ')'
print ( (1..10).collect do |x| x**2 end )
^
(irb):1: syntax error, unexpected kEND, expecting $end
print ( (1..10).collect do |x| x**2 end )
^
print (( (1..10).collect do |x| x**2 end ))
149162536496481100=> nil
print(a)do
和print(a)do
之间的区别。但我的情况有什么不同?为什么两个括号不同于一个?TL;博士
添加额外括号“有效”的原因是嵌套括号为最里面的表达式提供了更高的优先级。这消除了解析器标记的歧义,并允许将语句作为表达式而不是方法参数进行正确计算
分析
这与关键字的绑定优先级有关。大括号的优先级高于do/end关键字,因此这将起作用:
print ( (1..10).collect { |x| x**2 } )
因为它将圆括号表达式解释为表达式边界,而不是方法参数的边界
你也可以这样做:
print( (1..10).collect do |x| x**2 end )
因为这里的括号限制了一个参数,而不是分隔一个表达式。TL;博士
添加额外括号“有效”的原因是嵌套括号为最里面的表达式提供了更高的优先级。这消除了解析器标记的歧义,并允许将语句作为表达式而不是方法参数进行正确计算
分析
这与关键字的绑定优先级有关。大括号的优先级高于do/end关键字,因此这将起作用:
print ( (1..10).collect { |x| x**2 } )
因为它将圆括号表达式解释为表达式边界,而不是方法参数的边界
你也可以这样做:
print( (1..10).collect do |x| x**2 end )
因为这里的括号限制了一个参数,而不是分隔一个表达式。使用这个:
print((1..10).collect do |x| x**2 end)
更好的是:
print((1..10).collect do |x|; x**2; end)
始终删除方法名称和括号之间的空格。这是ruby解释器的语法分析之一。如果同时使用空格和括号,ruby有时无法正确解释
当您将单独的代码行放在一行中时,请使用代码>要分开(因为do end block应该放在单独的行中)使用以下方法:
print((1..10).collect do |x| x**2 end)
更好的是:
print((1..10).collect do |x|; x**2; end)
始终删除方法名称和括号之间的空格。这是ruby解释器的语法分析之一。如果同时使用空格和括号,ruby有时无法正确解释
当您将单独的代码行放在一行中时,请使用代码>分隔(因为do end block应该放在单独的行中)不要在方法名和打开的参数之间加空格-这会让rubyBetter混淆:除非绝对必要,否则根本不要使用括号。请不要手动将收到的实际、有意义的错误消息替换为“”。只需输入实际的错误消息。{}
对于单行块来说比do…end
更可取(顺便说一句,用这种方式更改第一个示例会使它工作)。我知道使用{}
它工作,但为什么?这就是问题所在。问题仍然存在。(())
vs(
)。不要在方法名和打开参数之间加空格-这会让rubyBetter混淆:除非绝对必要,否则不要使用括号。请不要手动将收到的实际、有意义的错误消息替换为“”。只需输入实际的错误消息。{}
对于单行块来说比do…end
更可取(顺便说一句,用这种方式更改第一个示例会使它工作)。我知道使用{}
它工作,但为什么?这就是问题所在。问题仍然存在(())
vs(
)。您的答案与已知问题相关:print(a)do
vsprint(a)do
。不是我问的问题。@egor如果你给解析器一个模棱两可的形式,它会给你模棱两可的结果print(1..10).collect do | x | x**2 end
返回枚举数,而不是数组。添加更多括号将强制执行另一层表达式求值,因此它“有效”,因为您赋予表达式更高的优先级。为什么要反对解析器呢?问题不在于没有括号的情况。我使用1和2个括号。为什么ruby对它们的解释不同?您的答案与已知的问题有关:print(a)do
vsprint(a)do
。不是我问的问题。@egor如果你给解析器一个模棱两可的形式,它会给你模棱两可的结果print(1..10).collect do | x | x**2 end
返回枚举数,而不是数组。添加更多括号将强制执行另一层表达式求值,因此它“有效”,因为您赋予表达式更高的优先级。为什么要反对解析器呢?问题不在于没有括号的情况。我使用1和2个括号。为什么ruby对它们的解释不同?没有语法上的原因ado。。。结束
块应放置在单独的行上。这只是一种惯例(而不是一种普遍的惯例;请参阅)。@echristopherson是的,它不是严格意义上的惯例,应该在单独的行中,但建议这样做。我的观点是在那里放分号,因为它可以避免问题,特别是如果你调用一个使用空格的方法,或者在那里放多行代码,我看不出会有什么不同。闻起来有点迷信。没有语法上的原因ado。。。结束
块应放置在单独的行上。这只是一种惯例(而不是一种普遍的惯例;请参阅)。@echristopherson是的,它不是严格意义上的惯例,应该在单独的行中,但建议这样做。我的观点是在那里放分号,因为它可以避免问题,特别是如果你调用一个使用空格的方法,或者在那里放多行代码,我看不出会有什么不同。闻起来有点迷信。