Делает ли attr_reader локальную переменную доступной в классе?
Почему type
переменная доступна в is_a_peacock?
метод в следующем?
class Animal
attr_reader :type
def initialize(type)
@type = type
end
def is_a_peacock?
if type == "peacock"
return true
else
return false
end
end
end
an = Animal.new('peacock')
puts an.is_a_peacock? # => true
Почему комментирует инициализацию @type
делать type
недоступен?
class Animal
attr_reader :type
def initialize(type)
#@type = type
end
def is_a_peacock?
if type == "peacock"
return true
else
return false
end
end
end
an = Animal.new('peacock')
puts an.is_a_peacock? # => false
3 ответа
"Зачем комментировать инициализацию
@type
делатьtype
недоступен?"
Это не. метод type
доступен. Просто не инициализирован. Потому что ты это закомментировал.
Если метод type
не было доступно, ваша программа зависала. (Как это происходит, когда вы комментируете attr_reader
).
Вы можете думать о attr_reader :type
как делать это для вас:
def type
@type
end
Но он не присваивает переменные экземпляра автоматически на основе того, что вы передаете в инициализатор, как вы, кажется, предполагаете, что это будет делать.
Так как вы больше не делаете @type = type
, @type
остается по умолчанию значение nil
, Каждая переменная экземпляра по умолчанию равна nil.
На заметку, вместо
if type == "peacock"
return true
else
return false
end
ты можешь написать просто
type == "peacock"
Почему
type
переменная доступна вis_a_peacock?
метод в следующем?
Ваше предположение на этот вопрос не имеет места. type
внутри тела метода is_a_peacock?
не является локальной переменной Это вызов метода.
Почему комментирует инициализацию
@type
делатьtype
недоступен?
Это не. Метод type
доступно, что возвращает значение @type
, который nil
по умолчанию.