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

Ruby调用其他文件中创建的类对象出现NameError如何解决?

问题原因

你遇到的报错本质是Ruby局部变量的作用域限制:在weapons.rb中直接定义的club = Weapon.new(...)属于文件级局部变量,作用域仅局限在weapons.rb文件内部,require加载文件后不会把这类局部变量暴露到主文件的运行上下文里,因此主文件找不到club变量。

解决方法

方案1:使用常量集中管理所有武器实例(最推荐)

把所有武器实例存入一个全局可访问的常量哈希/数组,既不会污染命名空间,也方便统一管理、遍历:

  1. 修改weapons.rb内容:
require_relative "class_definitions"

# 用常量哈希存储所有武器,键为调用时的标识,值为武器实例
WEAPONS = {
  club: Weapon.new("Club", 1, [1, 4]),
  # 剩余20余个武器按相同格式补充即可
  iron_sword: Weapon.new("Iron Sword", 2, [1, 6]),
  # ...
}
  1. 在main.rb中调用:
require_relative "class_definitions"
require_relative "weapons"

# 直接通过哈希键取对应实例调用方法即可
puts WEAPONS[:club].damage_roll

方案2:使用全局变量(适合小型简单项目)

如果项目规模极小,不想写额外的哈希结构,可以把武器实例定义为全局变量(前缀加$),全局变量在所有上下文都可直接访问:

  1. 修改weapons.rb中的实例定义格式:
$club = Weapon.new("Club", 1, [1, 4])
  1. 在main.rb中直接调用:
puts $club.damage_roll

该方案的缺点是全局变量过多会增加命名冲突概率,不易于后期维护。

内容的提问来源于stack exchange,提问作者SeatbeltHands

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:45:02