Ruby 在类中定义一个方法,该方法创建类的实例
我正在编写一个类Ruby 在类中定义一个方法,该方法创建类的实例,ruby,class,hashmap,Ruby,Class,Hashmap,我正在编写一个类MyHashSet,它模仿Set类。集合的元素包含为哈希项,读取{element=>true}。以下是它的定义: class MyHashSet attr_accessor :store def initialize @store = {} end def insert(el) @store.merge!(el => true) end def include?(el) @store[el] end def de
MyHashSet
,它模仿Set
类。集合的元素包含为哈希项,读取{element=>true}
。以下是它的定义:
class MyHashSet
attr_accessor :store
def initialize
@store = {}
end
def insert(el)
@store.merge!(el => true)
end
def include?(el)
@store[el]
end
def delete(el)
@store.select! {|key,value| key != el}
end
def to_a
@store.keys
end
def self.union(set)
result=MyHashSet.new
result.store=(self.store).merge(set.store)
result
end
end
最后一种方法union
应该是,如果我键入命令:
set1=MyHashSet.new
set2=MyHashSet.new
set1.insert("Mark Hamill")
set1.insert("Harrison Ford")
set1.insert("Anthony Daniels")
set2.insert("Ewan McGregor")
set2.insert("Natalie Portman")
set2.insert("Anthony Daniels")
然后试着计算
set3=set1.union(set2)
我应该得到一个set3
变量,它是MyHashSet
的一个实例,因此它的存储
是:
{"Mark Hamill"=>true, "Harrison Ford"=>true, "Anthony Daniels"=>true, "Ewan McGregor"=>true, "Natalie Portman"=>true}
但是,如果我尝试运行此命令,我会收到一条未定义的方法
错误消息:
`<main>': undefined method `union' for #<MyHashSet:0x00000000f4e3b8> (NoMethodError)
`:#(NoMethodError)的未定义方法“union”
我不明白Ruby为什么不选择这种方法。我发现如果我删除“联合”前面的“自我”,代码就可以工作了
我想这是因为该方法是在类的实例上而不是在类本身上调用的。您必须像实例方法而不是类方法一样使用它。您可以使用
self.class.new
代替MyHashSet.new
像这样
class MyHashSet
attr_accessor :store
def initialize
@store = {}
end
def insert(el)
@store.merge!(el => true)
end
def include?(el)
@store[el]
end
def delete(el)
@store.select! {|key,value| key != el}
end
def to_a
@store.keys
end
def union(set)
result = self.class.new
result.store = self.store.merge(set.store)
result
end
end
def initialize(store = nil)
@store = store || {}
end
class MyHashSet
attr_accessor :store
def initialize(store = nil)
@store = store || {}
end
def insert(el)
@store.merge!(el => true)
end
def include?(el)
@store[el]
end
def delete(el)
@store.select! { |key, value| key != el }
end
def to_a
@store.keys
end
def union(set)
self.class.new(self.store.merge(set.store))
end
end
输出
set1=MyHashSet.new
# => #<MyHashSet:0x1efea79 @store={}>
set2=MyHashSet.new
# => #<MyHashSet:0x34c75a @store={}>
set1.insert("Mark Hamill")
# => {"Mark Hamill" => true}
set1.insert("Harrison Ford")
# => {"Mark Hamill" => true, "Harrison Ford" => true}
set1.insert("Anthony Daniels")
# => {"Mark Hamill" => true, "Harrison Ford" => true, "Anthony Daniels" => true}
set2.insert("Ewan McGregor")
# => {"Ewan McGregor" => true}
set2.insert("Natalie Portman")
#=> {"Ewan McGregor" => true, "Natalie Portman" => true}
set2.insert("Anthony Daniels")
# => {"Ewan McGregor" => true, "Natalie Portman" => true, "Anthony Daniels" => true}
set3 = set1.union(set2)
# => #<MyHashSet:0x1c7cbad @store={"Mark Hamill"=>true, "Harrison Ford"=>true, "Anthony Daniels"=>true, "Ewan McGregor"=>true, "Natalie Portman"=>true}>
在此之后,您可以轻松地调用union
def union(set)
self.class.new(self.store.merge(set.store))
end
所以你的期末考试是这样的
def initialize(store = nil)
@store = store || {}
end
class MyHashSet
attr_accessor :store
def initialize(store = nil)
@store = store || {}
end
def insert(el)
@store.merge!(el => true)
end
def include?(el)
@store[el]
end
def delete(el)
@store.select! { |key, value| key != el }
end
def to_a
@store.keys
end
def union(set)
self.class.new(self.store.merge(set.store))
end
end
您正在对实例调用类方法。我建议使用
reject代码>而不是选择代码>在您的情况下。