Ruby报错:Array实例无`name`方法(NoMethodError)及食材添加问题
问题:向菜单添加食材时触发NoMethodError错误
我尝试用<<(push操作)将变量new_name和new_origin添加到ingredients数组实例时,收到如下错误:
undefined method `name' for an instance of Array (NoMethodError)
现有类定义
Menu类
class Menu attr_accessor :dessert, :ingredients def initialize (dessert, ingredients) @dessert = dessert @ingredients = ingredients end end
Ingredient类
class Ingredient attr_accessor :name, :origin def initialize (name, origin) @name = name @origin = origin end end
场景说明
读取包含菜单和食材信息的文本文件后,我需要向现有菜单中添加新的食材信息,已创建以下实例:
menu = Menu.new(dessert, ingredients) ingredient = Ingredient.new(name, origin)
错误代码位置
以下是用于更新菜单信息的menu_update方法(read_string是自定义函数,用于显示提示并返回用户输入的字符串):
# menus包含读取的菜单文件信息 def menu_update(menus) menu_id = read_integer_in_range("Enter the Menu to edit: ", 1, menus.length) menu_id = menu_id - 1 ingredient_count = menus[menu_id].ingredients.length new_name = read_string("Enter a name for new ingredient: ") new_origin = read_string("Enter a origin for new ingredient: ") menus[menu_id].ingredients.name << new_name menus[menu_id].ingredients.origin << new_origin puts("Update info") puts("Name: #{menus[menu_id].ingredients[ingredient_count].name}") puts("Origin: #{menus[menu_id].ingredients[ingredient_count].origin}") end
错误原因
menus[menu_id].ingredients是数组类型,存储的是多个Ingredient实例。你错误地直接给数组调用.name和.origin方法——数组本身没有这些属性,只有单个Ingredient对象才有,因此触发NoMethodError。
正确逻辑是:先创建一个新的Ingredient实例,再将这个实例添加到ingredients数组中,而非分别修改数组的name和origin属性。
修正后的代码
# menus包含读取的菜单文件信息 def menu_update(menus) menu_id = read_integer_in_range("Enter the Menu to edit: ", 1, menus.length) menu_id = menu_id - 1 new_name = read_string("Enter a name for new ingredient: ") new_origin = read_string("Enter a origin for new ingredient: ") # 创建新的Ingredient实例 new_ingredient = Ingredient.new(new_name, new_origin) # 将实例添加到ingredients数组 menus[menu_id].ingredients << new_ingredient puts("Update info") # 直接取数组最后一个元素(或用原长度作为索引,因为添加后新元素在原长度位置) puts("Name: #{menus[menu_id].ingredients.last.name}") puts("Origin: #{menus[menu_id].ingredients.last.origin}") end
期望输出
执行修正后的代码后,会得到如下输出:
Update info Name: peanut Origin: USA
内容的提问来源于stack exchange,提问作者Sulsoyy
相关产品推荐
相关产品推荐

