依存gemの拡張を開発中のgem内に留める
module
内でクラス拡張しても、そのファイルをrequire
するとクラス拡張はモジュール外にまで影響してしまう。module
内でrefine
を使えば問題ありません。refine
を使ったmodule
を、自作クラスの中でusing
で読みこめば、クラス拡張を自作クラス内に閉じ込めることができます。
module ExtendArray
refine Array do
def hello
"Array hello"
end
end
end
class HasArray
using ExtendArray
def hello_with_array(array)
array.hello
end
end
クラスではなく、オブジェクトにメソッドを追加するにはextend
を使います。これならgem
からオブジェクトを生成するゲッターの中で、そのオブジェクトだけに拡張を留めることができます。依存しているgem
の拡張を、今のgem
の利用ユーザーにまで影響させたくない場合は、この方法がいいかもしれません。
module ExtendArray
def say
"ExtendArray module say"
end
end
class HasArray
def get_extend_array
[5,6].extend(ExtendArray)
end
end