kar*_*dog 1 ruby raise parentheses
我喜欢用括号括起来的方法参数,这是一些Pascal的怀旧之情.清理代码时,如果我找到没有它的方法参数,我会立即将它们包含在内.今天它导致我的工作代码抛出错误,虽然我的语法看起来没问题根据文档.
Kernel.raise的文档具有以下格式:
(Object) raise(exception[, string [, array]])
Run Code Online (Sandbox Code Playgroud)
这些都有效:
> raise TypeError
TypeError: TypeError
> raise (TypeError)
TypeError: TypeError
> raise "Error message"
RuntimeError: Error message
> raise ("Error message")
RuntimeError: Error message
Run Code Online (Sandbox Code Playgroud)
但是下一个抛出语法错误的封闭版本:
> raise TypeError, "Error message"
TypeError: Error message
> raise (TypeError, "Error message")
SyntaxError: unexpected ')', expecting $end
Run Code Online (Sandbox Code Playgroud)
我可以没有它,我只是想知道为什么这会以错误结束.
您可能已经知道,在惯用的Ruby中,永远不会在方法的结尾和括号中的参数列表之间插入空格.一些风格指南明确禁止它.
这也是一个务实的原因.
1.9.2-p290 > def concat(a, b)
1.9.2-p290 > a + b
1.9.2-p290 > end
1.9.2-p290 > concat 'foo', 'bar'
=> "foobar"
1.9.2-p290 > concat('foo', 'bar')
=> "foobar"
1.9.2-p290 > concat ('foo', 'bar')
SyntaxError: (irb):27: syntax error, unexpected ',', expecting ')'
Run Code Online (Sandbox Code Playgroud)
你会遇到以这种方式调用任何方法的错误,而不仅仅是Kernel.raise.
我不熟悉Ruby内部,但我想这样做的原因是,当一个空格位于参数列表之前时,Ruby期待"no-parens"风格.所以这当然有效:
1.9.2-p290 :035 > concat ("bar"), ("foo")
=> "barfoo"
Run Code Online (Sandbox Code Playgroud)
据推测,Ruby在将结果传递给方法之前尝试评估每个带括号的表达式的内容.我推测写作raise (TypeError, "Error message")是要求Ruby评估TypeError, "Error message",当然这是失败的.