我知道我可以执行以下命令向String类添加方法
class String
def do_something
puts self.size
end
end
var = "test"
var.do_something
返回4
我希望能够有一个模块的函数,在一个字符串,但能够调用do_something
方法在这个字符串(见下面的例子)-这是可能的吗?
编辑:添加了不工作的示例代码
module TestModule
class String
def do_something
puts self.size
end
end
def self.test(str)
str.do_something
end
end
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
添加"::"告诉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
也许是这个?
module TestModule
module_function
def test(str)
str.instance_eval{doSomething}
end
end
Test.test(str)
编辑由于问题的变化而更改
把doSomething
的定义放在TestModule
类之外。
class String
def doSomething
puts size
end
end
module TestModule
module_function
def test(str)
str.doSomething
end
end