「○○と××のスクリプトを入れたら動きません」という現象をスクリプトの競合と言います。
競合は複雑な問題であり、それなりのスキルと高い根気が必要です。
ですので経験者でも敬遠して、初心者は諦めるしかないということが多いです。
尤も、リストに置く順序を入れ替えるだけでも解決することもあるので注意。
ここでは初心者向けに競合の説明とマージという対策を紹介します。
私が良く使っている方法ですが、単純な競合ならこれで解決できます。
逆に言うと、これで解決できないものは経験者でも面倒だと言えます。
競合の起きるワケまず適当にスクリプトを開いて眺めてください。
上の方にclass ~というのがあり、その下にdef ~というのが並んでいます。
この2つがセットです。classはクラス、defはメソッドと呼ばれるものです。
そして、スクリプト全ての中に、同じクラスの同名メソッドがある場合
「下にある方で上書きされる」という仕様です。これが一番大事なポイントです。
大抵のスクリプトは、デフォルトのスクリプトを上書きすることで機能します。
一方、競合というのは多くの場合
この上書きによって上の方のスクリプトの処理が消えるのが原因です。
処理の確認と「マージ」スクリプトの中で共通する(クラスも同じ)メソッドを探します。
#デフォルトスクリプト
class abc
def update
check
end
end
#スクリプトA
class abc
def update
check
change_chip
end
end
#スクリプトB
class abc
def update
pre_check
check
end
end
この場合、スクリプトAではchange_chipが、スクリプトBではpre_checkが追加されています。
しかし下にあるスクリプトBが上書きしてしまうため、change_chipの処理が起きません。
そこで、スクリプトAの処理とスクリプトBの処理を合わせた(マージ)スクリプトを追加します。
#スクリプトC
class abc
def update
pre_check
check
change_chip
end
end
実際の対策について大抵は
NoMethodErrorが起きるので
そのメソッドや、呼び出されているメソッドを全体検索に掛ければ良いでしょう。
同じメソッド名があった場合はクラスを確認して下さい。
同じクラスだった場合の対処法は上記の通りです。
また、違うクラスであってもスーパークラスが設定されていて
親子関係になっている場合は競合する可能性があります。
#スクリプトA
class abc
def update
check
change_chip
end
end
#スクリプトB
class xyz < abc
def update
pre_check
check
end
end
この場合は子のクラスの方に、マージする必要があります。
#スクリプトC
class xyz < abc
def update
pre_check
check
change_chip
end
end
[4回]
PR
-->