在标准类访问器中初始化self的值

时间:2012-03-07 12:07:55

标签: ruby

我怎么做这样的事情:

class Some < String
    def m1(a, b)
        self = a + b
    end
end

s = Some.new("hello")
s.m1("one ", "two")
p s # => "one two" 

3 个答案:

答案 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