Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在类中定义一个方法,该方法创建类的实例_Ruby_Class_Hashmap - Fatal编程技术网

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而不是
选择在您的情况下。