为什么额外的括号会对此代码产生影响?

时间:2012-06-24 16:36:04

标签: 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, expecting $end
    print ( (1..10).collect do |x| x**2 end )
                                           ^
    
  • 2个括号:

    print (( (1..10).collect do |x| x**2 end ))
    149162536496481100=> nil
    

我理解print (a) do <...>print(a) do <...>之间的区别。但是我的情况有什么不同?为什么两个括号不一样?

2 个答案:

答案 0 :(得分:1)

TL; DR

添加额外括号“起作用”的原因是因为嵌套括号为最内层表达式提供了更高的优先级。这消除了解析器的标记的歧义,并允许将语句正确地计算为表达式而不是方法参数。

分析

它与关键字的绑定优先级有关。大括号的优先级高于do / end关键字,因此可以使用:

print ( (1..10).collect { |x| x**2 } )

因为它将括号表达式解释为表达式边界,而不是将方法参数绑定。

你也可以这样做:

print( (1..10).collect do |x| x**2 end )

因为这里的括号绑定了一个参数,而不是将表达式分开。

答案 1 :(得分:0)

使用此:

print((1..10).collect do |x| x**2 end)

更好的是:

print((1..10).collect do |x|; x**2; end)

始终删除方法名称和括号之间的空格。它是ruby解释器的语法分析之一。如果你同时放置空格和括号,ruby有时无法正确解释。

当您在一行中放置单独的代码行时,请使用;分隔(因为端块应该放在单独的行中)