虽然添加一些空格以使代码更具可读性(与上面的代码对齐),但我遇到了这个:
class C
def x
42
end
end
m=C.new
现在这将给出#34;错误的参数数量":
m.x *m.x
这将给出"语法错误,意外的tSTAR,期待$ end":
2/m.x *m.x
解析器究竟发生了什么?
我使用Ruby 1.9.2和2.1.5进行了测试。
答案 0 :(得分:6)
*
用于运算符(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'])
arg1
设置为Hello
,arg2
设置为World
。
我认为规则是确定使用哪个:
*
之后的空格,但不 - >论证解包*
运算符,因为Ruby执行运算符重载)。好的指导方针是:
*
运算符(乘法)时,请在*
之前和之后使用空格。当您运行ruby -v
时,Ruby会实际警告您:
test.rb|11 warning| `*' interpreted as argument prefix
test.rb|12 warning| `*' interpreted as argument prefix
答案 1 :(得分:3)
用简单的语言:
当你说
时m.x *m.x
它在内部调用m.x(*m.x)
,即它将*m.x
视为m.x
的splat参数。
因为,在x
上定义了m
方法,它接受任何参数,你得到“错误的参数数量”错误。
致电时
m.x * m.x
它将*
视为x
的方法,它接受类型为'Fixnum'的对象,而在Ruby中,为{Fixnum'类定义了带参数的*
方法。所以,它与调用
m.x.*(m.x)
因此它有效!
我希望这有助于您了解问题,如果需要澄清,请随时发表评论。