Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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 为什么额外的括号在这段代码中起作用?_Ruby - Fatal编程技术网

Ruby 为什么额外的括号在这段代码中起作用?

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,

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
    之间的区别。但我的情况有什么不同?为什么两个括号不同于一个?

    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
    vs
    print(a)do
    。不是我问的问题。@egor如果你给解析器一个模棱两可的形式,它会给你模棱两可的结果
    print(1..10).collect do | x | x**2 end
    返回枚举数,而不是数组。添加更多括号将强制执行另一层表达式求值,因此它“有效”,因为您赋予表达式更高的优先级。为什么要反对解析器呢?问题不在于没有括号的情况。我使用1和2个括号。为什么ruby对它们的解释不同?您的答案与已知的问题有关:
    print(a)do
    vs
    print(a)do
    。不是我问的问题。@egor如果你给解析器一个模棱两可的形式,它会给你模棱两可的结果
    print(1..10).collect do | x | x**2 end
    返回枚举数,而不是数组。添加更多括号将强制执行另一层表达式求值,因此它“有效”,因为您赋予表达式更高的优先级。为什么要反对解析器呢?问题不在于没有括号的情况。我使用1和2个括号。为什么ruby对它们的解释不同?没有语法上的原因a
    do。。。结束
    块应放置在单独的行上。这只是一种惯例(而不是一种普遍的惯例;请参阅)。@echristopherson是的,它不是严格意义上的惯例,应该在单独的行中,但建议这样做。我的观点是在那里放分号,因为它可以避免问题,特别是如果你调用一个使用空格的方法,或者在那里放多行代码,我看不出会有什么不同。闻起来有点迷信。没有语法上的原因a
    do。。。结束
    块应放置在单独的行上。这只是一种惯例(而不是一种普遍的惯例;请参阅)。@echristopherson是的,它不是严格意义上的惯例,应该在单独的行中,但建议这样做。我的观点是在那里放分号,因为它可以避免问题,特别是如果你调用一个使用空格的方法,或者在那里放多行代码,我看不出会有什么不同。闻起来有点迷信。