Aly*_*Aly 4 ruby monkeypatching ruby-1.9.2
我知道我可以执行以下操作来向String类添加方法
class String
def do_something
puts self.size
end
end
var = "test"
var.do_something
Run Code Online (Sandbox Code Playgroud)
这将回来 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
Run Code Online (Sandbox Code Playgroud)
这给出了错误: undefined method 'do_something' for "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
Run Code Online (Sandbox Code Playgroud)
添加"::"告诉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
Run Code Online (Sandbox Code Playgroud)