Давайте начнем с самого большого неправильного числа - в Ruby нет отдельного шага объявления переменных - переменные объявляются по мере их установки.
Какая разница? Посмотрите на Java например:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
}
Мы должны объявить все переменные экземпляра, прежде чем мы установим их в инициализаторе (Bicycle). Тот же код в Ruby гласит:
class Bicycle
def initialize(cadence, speed, gear)
@cadence = cadence
@speed = speed
@gear = gear
end
end
Нет декларации - только присвоение. Ruby даже позволит вам получить доступ к переменным экземпляра, которые не были установлены без ошибок.
irb(main):003:0> @not_set
=> nil
Вы не можете сделать это (обычно) в языках, где переменные должны быть определены *.
Меня учили объявлять переменные моего экземпляра с помощью def
инициализации. У меня сложилось впечатление, что я могу объявить
переменные экземпляра только в моих методах инициализации.
Чепуха. Вы можете назначать переменные экземпляра где угодно. Обычно это делается во всем - от сеттеров и мутаторов (методов, которые изменяют объект) до фабричных методов (методов класса, возвращающих экземпляр) или в любом месте, где вы изменяете состояние объекта.
class Book
def initialize(title, author)
@title = title
self.author = author # calls the setter.
end
# A factory method
def create_from_csv(filename)
# ...
end
# A very contrived setter
def author=(author)
@author = "#{author.forename.upcase}. #{author.surname}"
end
# a mutator
def out_of_print!
@out_of_print = true
@last_printed = Date.today
end
end
Однако метод initialize
- это место, где вы должны обрабатывать инициализацию ваших объектов (duuh), и, таким образом, это очевидное место для установки начальных значений.