我有一个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)