gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:39:35 25 4
gpt4 key购买 nike

我正在尝试创建一个模块来扩展 FileUtils 类的功能。

require 'fileutils'

module FileManager
extend FileUtils
end

puts FileManager.pwd

如果我运行它,我会得到一个 私有(private)方法 'pwd' 调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com