Вот некоторый код:
class Person
def initialize(age)
@age = age
end
def age
@age
end
def age_difference_with(other_person)
(self.age - other_person.age).abs
end
protected :age
end
То, что я хочу знать, это разница между использованием @age
и self.age
в age_difference_with
методе.
ruby
self
instance-variables
sarunw
источник
источник
Разница в том, что он изолирует использование метода от его реализации. Если реализация свойства должна была измениться - скажем, чтобы сохранить дату рождения, а затем вычислить возраст на основе разницы во времени между текущим временем и датой рождения - тогда код, зависящий от метода, менять не нужно. Если бы оно использовало свойство напрямую, то изменение должно было бы распространиться на другие области кода. В этом смысле непосредственное использование свойства более хрупко, чем использование предоставленного ему класса интерфейса.
источник
Будьте осторожны, когда вы унаследуете класс, из
Struct.new
которого вы найдете отличный способ создания инициализатора ( Как создать инициализатор в Ruby? )вернется
Однако при удалении инициализатора он вернется
С определением класса
Вы должны предоставить конструктор.
вернется
источник
Первый ответ совершенно верен, но, как относительный новичок, я не сразу понял, что он имел в виду (отправка сообщений самому себе ... ага ...). Я думаю, что короткий пример поможет:
источник
Там нет никакой разницы. Я подозреваю, что это было сделано только для документальной ценности видения
self.age
иother_person.age
рядом друг с другом.Я полагаю, что использование позволяет в будущем написать реальный геттер, что может сделать что-то более сложное, чем просто вернуть переменную экземпляра, и в этом случае метод не нужно будет менять.
Но об этой абстракции вряд ли стоит беспокоиться, в конце концов, если реализация объекта изменилась, разумно изменить другие методы, в какой-то момент простая ссылка в самом объекте совершенно разумна.
В любом случае, абстракция
age
свойства все еще не объясняет явного использованияself
, поскольку простоage
бы также вызвал метод доступа.источник
@age - определенно переменная age
self.age - относится к возрасту свойства экземпляра.
источник