令人困惑的案例:
arr = [:one, :two]
attr_accessor *arr + [:three]
在这种情况下,似乎我们对splat +
执行*arr
操作。但是,通常我们不能对splat执行任何操作。所以这让我很困惑。
我更喜欢这样的另一个案例:
arr = [:one, :two]
attr_accessor *(arr << :three)
那么,你有什么看法?
答案 0 :(得分:2)
不,你的优先权是错的。 *arr + [:three]
为*(arr + [:three])
,因此它将三个参数展开到attr_accessor
。 splat的结果不是Ruby值,因此无法对其执行任何操作。在+
是运算符的同一意义上,它不是运算符。虽然+
是一种方法,但*
的这种用法不是。
(这里没有任何意见,只有关于Ruby如何运作的事实。)