ruby乘法语句中的星号前空格语法
在添加一些空白以使代码更具可读性(与上面的代码对齐)时,我遇到了以下问题:ruby乘法语句中的星号前空格语法,ruby,syntax-error,Ruby,Syntax Error,在添加一些空白以使代码更具可读性(与上面的代码对齐)时,我遇到了以下问题: class C def x 42 end end m=C.new 现在,这将给出“错误数量的参数”: 这将给出“语法错误,意外的tSTAR,预期$end”: 解析器中到底发生了什么 我使用Ruby 1.9.2和2.1.5进行了测试。*用于运算符(42*42)和参数解包(myfun*[42,42]) 当您这样做时: m.x *m.x 2/m.x *m.x Ruby将此解释为参数解包,而不是*运算符(
class C
def x
42
end
end
m=C.new
现在,这将给出“错误数量的参数”:
这将给出“语法错误,意外的tSTAR,预期$end”:
解析器中到底发生了什么
我使用Ruby 1.9.2和2.1.5进行了测试。
*
用于运算符(42*42
)和参数解包(myfun*[42,42]
)
当您这样做时:
m.x *m.x
2/m.x *m.x
Ruby将此解释为参数解包,而不是*
运算符(即乘法)
如果您不熟悉,参数解包(有时也称为“splat”或“splats”)意味着您可以使用如下函数:
def myfun arg1, arg2; end
myfun(*['Hello', 'World'])
这样称呼它:
def myfun arg1, arg2; end
myfun(*['Hello', 'World'])
arg1
设置为Hello
,arg2
设置为World
我相信这些规则是为了确定使用哪一种:
- 在
->参数解包之前而不是之后加空格*
- 函数括号开始->参数解包
- 其他一切->乘法(或者更确切地说,是
操作符,因为Ruby没有操作符重载)*
*
运算符(乘法),请在*
之前和之后使用空格Ruby-v
时,Ruby实际上会警告您这一点:
test.rb|11 warning| `*' interpreted as argument prefix
test.rb|12 warning| `*' interpreted as argument prefix
用简单的语言:
当你说
m.x *m.x
它在内部调用m.x(*m.x)
,即将*m.x
视为m.x
的splat参数
由于在m
上定义了一个x
方法,该方法接受任何参数,因此您得到的是“参数数目错误”错误
当你打电话的时候
m.x * m.x
它将*
视为x
的一个方法,该方法接受“Fixnum”类型的对象,在Ruby中,接受参数的*
方法是为“Fixnum”类定义的。所以,这和打电话一样
m.x.*(m.x)
因此它起作用了
我希望这有助于您理解问题,如果需要任何澄清,请随时发表评论。怀疑与此有关,但错误消息没有太大帮助+1代表ruby-v。这个的确切语法规则是否有文档记录?@trygveflat当有Ruby时(单击底部的“我同意”),我试图查找它,但现在没有足够的时间来解释标准规范语言;-)