ruby - 如何将包含的私有(private)方法公开为公共(public)类方法?

标签 ruby module

我正在尝试制作一个扩展 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/

相关文章:

ruby-on-rails - 如何在 Rails 中打印出对象的内容以便于调试?

php - 如何正确删除drupal不用的核心模块?

dynamic - elixir 动态模块调用

perl - 您建议使用哪个 Perl 模块来发送和接收电子邮件?

ruby - 将 UTF-8 设置为 Ruby 1.9.3 的默认值

ruby - 如何遍历 popen 输出?

ruby-on-rails - 目录 : How to show/print data from other model on a table?

javascript - 模块中未找到函数

R shiny - Shiny 模块函数中最后单击的按钮 id

ruby - Ruby 中的管道符号是什么意思?