Определение нестандартных методов доступа с помощью attr_accessor - PullRequest
0 голосов
/ 23 октября 2018

Мне интересно, можно ли использовать attr_accessor для ссылки на атрибут с именем, отличным от методов, которые он будет определять.Например, у меня есть класс GameWindow с атрибутом bg_color, и я хочу, чтобы attr_accessor определял методы background и background=.Есть ли способ сделать это, или я должен сам определить методы?

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Используйте attr_accessor в сочетании с alias_method.Например:

class Foo
  attr_accessor :bar

  alias_method :baz, :bar
  alias_method :baz=, :bar=

  def initialize
  end
end

Затем убедитесь, что он работает должным образом:

foo = Foo.new
=> #<Foo:0x00007fabb12229a0>
foo.bar = 'foobar'
=> 'foobar'
foo.baz
=> 'foobar'
foo.baz = 'barfoo'
=> 'barfoo'
foo.bar
=> 'barfoo'
0 голосов
/ 23 октября 2018

Вы хотите, чтобы attr_accessor определял методы background и background =.attr_accessor используется для определения метода получения и установки для переменной экземпляра, а метод - это то, что возвращает значение, но вы не можете использовать метод установки, например background = for.

Пожалуйста, проверьте с помощью alias_attribute & alias_method.

0 голосов
/ 23 октября 2018
attr_accessor :background

- это простой простой макрос, который генерирует для вас следующие два метода:

def background
  @background
end

def background=(value)
  @background = value
end

Когда вы хотите получить метод получения и метод установки с определенным именем, но назначить значение дляпеременная с другим именем, затем просто напишите методы самостоятельно - например, так:

def background
  @bg_color
end

def background=(value)
  @bg_color = value
end
0 голосов
/ 23 октября 2018

attr_accessor создает переменную экземпляра (здесь @bg_color; или, точнее, делает ее доступной для вызова объекта, хотя, как указывают Кэри и Йорг ниже, переменная экземпляра isn 'строго созданы до тех пор, пока не будет назначено) и методы чтения и записи, названные в соответствии с аргументами символа, которые вы используете.Если вы хотите, чтобы оно было названо background, почему бы вам просто не изменить имя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...