表达{ a: 1 }不是问题
但 Rubocop 的 point( Lint/Syntax: unexpected token tCOLON(Using Ruby 3.1 parser; configure using TargetRubyVersion parameter, under AllCops)) 出现在表达式 中
puts { a: 1 }。
有谁知道为什么这个声明违反规则?如果您有参考资料,请给我它的网址,我将不胜感激。
我使用 rubocop 版本 1.24.1 并设置TargetRubyVersion在.rubocop.yml. ruby 版本 2.7、3.0 和 3.1 均经过测试,结果相同。
Ruby 中的大括号用于两件事:块和散列。而且 Ruby 解析器不会执行无限的前瞻来确定它正在查看哪一个。如果当前语法上下文接受一个块,Ruby 会假设您用大括号给出的内容是一个块。
puts { a: 1 }
Run Code Online (Sandbox Code Playgroud)
首先,我们解析puts. 它是一个标识符,并且不是局部变量,因此我们假设它是当前 ( main) 对象上的一个方法。现在我们看到了{。它可以是哈希值或块。我们刚刚解析了一个启动函数调用的标识符,因此块在这里是有意义的。让我们将其解析为一个块。
接下来我们看看a。好吧,没关系。一个没有参数的块,我们有一个名为 的标识符a。同样,它不是局部变量,因此它必须是 上的方法main。然后我们发现:这不起作用。:此时语法中不可能出现 a ,因此这是一个错误。Ruby 不会回去尝试“散列”选项;它已经完全致力于解析一个块,但失败了。
要puts使用单个哈希参数进行调用,请使用括号来消除歧义。
puts({ a: 1 })
Run Code Online (Sandbox Code Playgroud)