我正在尝试制作一个扩展 FileUtils
功能的模块类。
require 'fileutils'
module FileManager
extend FileUtils
end
puts FileManager.pwd
如果我运行这个,我会得到 private method 'pwd' called for FileManager:Module (NoMethodError)
错误
更新:
为什么这些类方法是私有(private)包含的?如何公开它们全部而无需手动包含每个方法作为 FileManager 模块中的公共(public)类方法?
最佳答案
看起来FileUtils
上的实例方法都是私有(private)的(正如这里另一个答案中提到的,这意味着它们只能在没有显式接收者的情况下被调用)。当你包含或扩展时你得到的是实例方法。例如:
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
上想要的所有方法都有两次,作为私有(private)实例方法和公共(public)类方法(又名单例方法)。
基于this answer我想出了这段代码,它基本上将所有类方法从 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"
它并不漂亮,但它可以完成工作(据我所知)。
关于ruby - 如何将包含的私有(private)方法公开为公共(public)类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13058617/