2016-12-16 42 views
0

Ruby的操作员和他们各自的相关性有一个很好的表格here。根据这张表格,相当数量的操作员被关联,这对我来说并不是特别有用。有没有一种方法可以将左关联运算符更改为正确关联?我的代码设置的方式x * x * x将不起作用,但x * (x * x)将工作。这是因为我的具体实现x * x它返回一个数组。由于这个原因,数组可以是传递给方法的参数,但它不能是调用方法的对象。我不能覆盖数组类中的*方法,因为我的项目中有其他地方正在使用其默认功能,因此不能选择猴子修补。有没有办法改变我班的*运算符的关联性?我可以更改操作员的相关性吗?

+0

我怀疑这个关联性是由Ruby的解析器处理的,因此无论您的类如何定义,“x * x * x”将总是被解释为“x。*(x。*(x))”。你可以使用'。*'以外的方法吗?你可以让'x * x'(或'x.some_method(x)')返回数组以外的东西吗?至少是'Array'的一个子类,以便您可以单独保留默认行为? – Max

+0

@Max我实际上有'def method_missing(method,* args); [self,method.to_sym,* args] .flatten;在我的班级结束。我想我最好的选择是创建一个数组子类来处理这个问题。感谢您的建议! –

回答

0

像几乎所有的语言,Ruby没有允许你改变操作符的结合。 (有些例外是伊欧凯,SEPH,哈斯克尔,丰泽,也许Perl6。)

对于Numeric类的实例,有一个type coercion protocol它可能会被滥用给改变算术运算符的结合性的外观,但是这是一个非常脆弱的黑客攻击,而不是协议的目的。

相关问题