ruby – 在模块中打开类
发布时间:2020-12-17 03:58:58 所属栏目:百科 来源:网络整理
导读:我知道我可以执行以下操作来向String类添加方法 class String def do_something puts self.size endendvar = "test"var.do_something 这将返回4 我希望能够拥有一个带有String的函数的模块,但是能够在这个字符串上调用do_something方法(例如见下文) – 是否
我知道我可以执行以下操作来向String类添加方法
class String def do_something puts self.size end end var = "test" var.do_something 这将返回4 我希望能够拥有一个带有String的函数的模块,但是能够在这个字符串上调用do_something方法(例如见下文) – 是否可能? 编辑:添加了无效的示例代码 module TestModule class String def do_something puts self.size end end def self.test(str) str.do_something end end 这给出了错误:未定义的方法’do_something’代表“hello”:String(NoMethodError) 解决方法
编写代码的方式是定义一个名为TestModule :: String的新类.如果要修改内置的Ruby String类,如果要将声明保留在模块中,则需要使用String的完全限定名称(带“”::“).
module TestModule class ::String def do_something puts self.size end end def self.test(str) str.do_something end end 添加“::”告诉Ruby您想要的String类不是TestModule的一部分. 在同一个文件中声明TestModule之外的String可能更简洁. 如果您不想污染全局String类,则只需修改要将方法添加到的特定String实例. module TestModule def self.test(str) do_somethingify!(str) str.do_something end def self.do_somethingify!(str) unless str.respond_to? :do_something str.instance_eval do def do_something puts size end end end end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- C# 中的EventHandler实例详解
- ruby-on-rails – 如何获得特定rake任务的帮助?
- SQLite剖析之临时文件、内存数据库
- C#执行存储过程并将结果填充到GridView的方法
- 正则表达式{n,m}量词(至少n次,最多m次)
- WebLogic Integration和Oracle Service Bus之间的区别?
- c# – 为什么.NET System.IO.File使用Create / Open而不是构
- 是否有可能写出一个C#double并用Java读取它?
- iphone – 为什么Foundation.h没有在标准的Xcode模板中导入
- c++使用win32 api windows下遍历文件夹