Я пытаюсь сделать код с кошкой, где вы можете покупать определенные игрушки и использовать их. Однако всякий раз, когда я пытаюсь перечислить игрушки в «магазине», каждый раз выдает ошибку. Я не уверен, что я делаю неправильно, но это определенно где-то в том, как я выполняю команду.
class Toy
attr_reader:name
def initialize(name)
@name = name
end
def shop
puts "#{@Toy}"
end
end
toy.shop
Я не уверен, как правильно запустить эту команду, но я совершенно уверен, что проблема в строке «toy.shop».
Решение проблемы
Рабочая переработка и упрощение
Есть ряд проблем с вашим текущим кодом. Поскольку в Ruby всегда есть несколько способов сделать практически все, вы можете сделать это и другими способами. Тем не менее, вот несколько ключевых вопросов:
- На самом деле вы не используете #initialize.
- Вы не создаете экземпляр нового объекта Toy с помощью Toy#new.
- Вы не назначаете Toy#new локальной переменной игрушки.
- Поскольку игрушка не определена, у нее нет доступа ни к одному из методов экземпляра Toy, например #shop.
- Несуществующая переменная toy является получателем для метода #shop, поэтому она вызовет NameError, если игрушка не определена, или NoMethodError, если игрушка определена, но не является экземпляром класса Toy или другого класса, который может отвечать на метод #shop..
Основываясь на вашем ограниченном примере, я бы переписал и упростил код следующим образом:
class Toy
attr_accessor:name
def shop
p "You bought a #{@name}."
end
end
toy = Toy.new
toy.name = "mouse"
toy.shop
#=> "You bought a mouse."
Почему Kernel#p вместо Kernel#puts
Обратите внимание, что Kernel#p не только напечатает ваш вывод в STDOUT, но также вернет значение, которое чрезвычайно полезно в REPL или при отладке кода. С другой стороны, Kernel#putsnil всегда возвращает результат, поэтому я обычно предпочитаю #p, если только вывод #inspect не является нежелательным по какой-либо причине. Ваш пробег в этом отношении может варьироваться.
Смотрите также
- Ключевое
defined?слово. - Переменное присвоение.
- Синтаксис Руби.
- Рубиновые исключения.
Комментариев нет:
Отправить комментарий