Был ли способ превратить @property
в метод с set
и get
, поэтому @property
вызовет метод вместо возврата фактического свойства, а @property = someval
также вызовет метод вместо присвоения фактическому свойству?
В моем проекте объекты хранят значения в базе данных. Рассмотрим этот простой модуль базы данных, который хранит записи в памяти. В моем реальном проекте это DBM, подобная PostgreSQL:
module MyDB
RECORDS = {}
def self.create(pk)
RECORDS[pk] ||= {}
end
def self.set(pk, key, val)
return RECORDS[pk][key] = val
end
def self.get(pk, key)
return RECORDS[pk][key]
end
end
У объектов есть поля, которые хранятся в этой базе данных. Итак, в этом классе поле species
хранится и извлекается из базы данных:
class Pet
def initialize(pk)
@pk = pk
MyDB.create(@pk)
end
def species=(val)
MyDB.set @pk, 'breed', val
end
def species()
return MyDB.get(@pk, 'breed')
end
end
Простое использование класса Pet
может выглядеть так:
motley = Pet.new('motley')
motley.species = 'cat'
Это работает в настоящее время, но здесь я столкнулся с раздражением. Я сделал что-то подобное в классе:
def some_method(newval)
@species = newval
end
Затем, когда я запустил код, я получил такой результат:
motley.some_method 'whatever'
puts motley.species #=> cat
Затем я понял, что это не было ошибкой, а я должен был сделать это:
def some_method(newval)
self.species = newval
end
Я думаю, @species = newval
имеет смысл. Он чувствует как будто я устанавливаю свойство объекта.
Это был способ присвоения методу свойству, что-то вроде:
def :@species=(val)
return MyDB.set(@pk, 'breed', 'val')
end
def :@species
return MyDB.get(@pk, 'breed')
end
Is Есть ли способ сделать такую вещь? Должно ли быть?