Инициализируйте значение self в стандартном методе доступа - PullRequest
2 голосов
/ 07 марта 2012

Как я могу сделать что-то вроде этого:

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 ]

2 голосов
/ 07 марта 2012

Это зависит от того, как именно вы определяете «что-то вроде».

Если вы хотите сделать так, чтобы все переменные, которые указывают на данный объект 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 голос
/ 07 марта 2012

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")
0 голосов
/ 07 марта 2012

Как то так?:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...