上のインスタンスメソッドFileUtils
はすべてプライベートのようです(ここでの別の回答で述べられているように、明示的なレシーバーなしでのみ呼び出すことができます)。そして、インクルードまたはエクステンドしたときに得られるのは、インスタンスメソッドです。例えば:
require 'fileutils'
class A
include FileUtils
end
A.new.pwd #=> NoMethodError: private method `pwd' called for #<A:0x0000000150e5a0>
o = Object.new
o.extend FileUtils
o.pwd #=> NoMethodError: private method `pwd' called for #<Object:0x00000001514068>
FileUtils
プライベートインスタンスメソッドとパブリッククラスメソッド(別名シングルトンメソッド)として、必要なすべてのメソッドが2回存在することがわかります。
この回答に基づいて、基本的にすべてのクラスメソッドをからFileUtils
にコピーするこのコードを思いつきましたFileManager
。
require 'fileutils'
module FileManager
class << self
FileUtils.singleton_methods.each do |m|
define_method m, FileUtils.method(m).to_proc
end
end
end
FileManager.pwd #=> "/home/scott"
それはきれいではありませんが、それは仕事をします(私が知る限り)。