(def|set|get)_copyとMethod.&=, |=, =&, =|
あるメソッドにORやANDで別のメソッドを結合するとき、getとsetで2回同じメソッド名を表記しなければいけません。
Object.method@ `[ ... ].| (Object.method$)
冗長です。これを解決すべく、Methodオブジェクトに&=, |=, =&, =|を定義しました。'='が引数の位置になります。*1
これで、さきほどのものを、
Object.method$.=| `[ ... ]
と書けるようになりました。
問題がひとつあります。Object.methodのconstness*2です。多くのメソッドは組み込みもユーザ定義*3もconst*4です。constを安全に解除するためにcopyする必要があります。*5そこで、(def|set|get)_copyが登場します。それぞれ、::, @@, $$というシンタクスシュガーが用意されています。
指定スロットをそのcopyに置き換えたい場合、get_copy($$)を使います。
Object.method$$.=| `[ ... ]
これでObject.methodがconstでも問題なくなりました。
(def|set|get)_copyがすること
Object.string:: 'abc' //Object.string: 'abc'.copy Object.string@@ 'ABC' //Object.string@ 'ABC'.copy Object.string$$ //Object.string@ Object.string$.copy
def_copyやset_copyはその値を書き換えたいときに便利に使えるはずです。今までいちいちリテラルに.copyを付けなければいけなかった場面はすべてこれらを使うことになります。
見てのとおり、get_copyの実態はget_copy_setなわけですが、便宜上get_copyとなっております。
Method.&=, |=, =&, =|がすること
Object.method$.|= `[ ... ] //Object.method$.= (Object.method$.| `[ ... ]) Object.method$.&= `[ ... ] //Object.method$.= (Object.method$.& `[ ... ]) Object.method$.=| `[ ... ] //Object.method$.= (`[ ... ].| (Object.method$)) Object.method$.=& `[ ... ] //Object.method$.= (`[ ... ].& (Object.method$))
Object.methodがconstの場合にエラーになること意外に特に留意する点はありません。