我怎么做这样的事情:
class Some < String
def m1(a, b)
self = a + b
end
end
s = Some.new("hello")
s.m1("one ", "two")
p s # => "one two"
答案 0 :(得分:2)
这取决于你如何定义“类似的东西”。
如果你想使所有指向给定Some
对象的变量现在改为指向a + b
结果的字符串,那就不可能了。
如果要更改给定Some
对象的字符串内容,可以使用replace
方法,即replace(a+b)
。
说明使用replace
和重新分配之间的区别:
class Some < String
def m1(a, b)
replace( a + b )
end
end
s1 = Some.new("hello")
p s1.object_id # some number
s1.m1("one ", "two")
p s1 # "one two"
p s1.object_id # the same number as above
p s1.class # Some
s2 = Some.new("hello")
p s2.object_id # some number
s2 = "one " + "two"
p s2 # "one two"
p s2.object_id # a different number
p s2.class # String
使用方法无法实现后一种行为。
答案 1 :(得分:1)
对于这种情况,Ruby在标准库中有delegate
。您可以
安全地覆盖标准类。建议使用!
破坏性方法名称。
require 'delegate'
class MyStr < DelegateClass(String)
def initialize dnm=""
@str = dnm
super(@str)
end
def m1!(a,b)
@str.replace(a + b)
end
end
s = MyStr.new("deneme")
s.m1!("de", "ne")
答案 2 :(得分:0)
这样的东西?:
class Some < String
def m1(a, b)
self.clear << a << b
end
end
some = Some.new("bye")
some.m1("hello ","world")
p some #=>hello world