You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby报错:Array实例无`name`方法(NoMethodError)及食材添加问题

问题:向菜单添加食材时触发NoMethodError错误

我尝试用<<(push操作)将变量new_name和new_origin添加到ingredients数组实例时,收到如下错误:

undefined method `name' for an instance of Array (NoMethodError)

现有类定义

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:05:07