2016-12-16 13 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はあなたが演算子の結合規則を変更することはできません。クラスNumericのインスタンスの場合(一部例外Ioke、SEPH、ハスケル、要塞、そしておそらくPerl6のです。)

は、算術演算子の結合性を変化させた外観を与えるために悪用される可能性がtype coercion protocolがあり、それはです本当に脆弱なハックで、プロトコルが意図しているものではありません。

関連する問題