"block in initialize: uninitialized constant"的红宝石错误,但与IRB运行良好



我有一个ruby脚本,如下所示:

class HashSet < Hash
def initialize
super { |hash, key| hash[key] = Set.new }
end
end
data = {}
data["hash"] ||= HashSet.new
data["hash"]["colors"].add "blue"
puts data

运行此脚本时引发错误:

$ ruby demo.rb 
Traceback (most recent call last):
2: from demo.rb:9:in `<main>'
1: from demo.rb:9:in `[]'
demo.rb:3:in `block in initialize': uninitialized constant HashSet::Set (NameError)

但当我用irb运行它时,它运行得很好:

$ irb -r ./demo.rb 
{"hash"=>{"colors"=>#<Set: {"blue"}>}}

有什么不同?我如何修复脚本?

将其添加到脚本顶部:

require "set"

说明:

Set不是ruby核心库的一部分。相反,它是ruby标准库的一部分。

为了使用Set,您必须在某处显式地使用库require

事实上,irb实际上已经需要set作为其初始化过程的一部分:

$ irb
irb(main):001:0> Set
=> Set
$ ruby -e 'Set'
Traceback (most recent call last):
-e:1:in `<main>': uninitialized constant Set (NameError)

相关内容

最新更新