在括号中包含参数时,Ruby Kernel.raise方法会引发错误

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)

我可以没有它,我只是想知道为什么这会以错误结束.

can*_*lin 5

您可能已经知道,在惯用的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",当然这是失败的.