在Ruby中实例化一个类并填充实例变量

时间:2011-03-04 06:30:52

标签: ruby-on-rails ruby

我有一种感觉,我在这里错过了很简单的东西。我有一个链接到外部服务的类。我想通过调用create方法或find方法来实例化它。两种方法都会使用哈希填充实例变量“@node”,方法是创建节点或查找它。

我有

class GenreInfluence

@@neo ||= Neography::Rest.new()
attr_accessor :node

def initialize
end

def self.create
    @node = @@neo.create_node
    self.new
end

def self.find(node_id)
    @node = @@neo.get_node(node_id)
    self.new
end

def get_hash
  @node
end

如果我评论发生了什么,我可以看到它正在创建类并获得正确的哈希值:

theInstance = GenreInfluence.find(20)
theInstance.get_hash

只需返回零。为什么哈希没有存储在实例变量中??

3 个答案:

答案 0 :(得分:9)

您无法在非实例(静态或类)方法中设置实例变量。此外,您的方法都返回self.new,这有效地返回了一个没有设置实例变量的类的新实例。

如何在静态类方法中创建类的新实例,在该实例上设置变量 ,然后返回它(而不是返回self.new) :

class GenreInfluence
  @@neo ||= Neography::Rest.new()
  attr_accessor :node

  def initialize
  end

  def self.create
    influence      = self.new
    influence.node = @@neo.create_node
    influence
  end

  def self.find(node_id)
    influence      = self.new
    influence.node = @@neo.get_node(node_id)
    influence
  end

  def get_hash
    @node
  end
end

答案 1 :(得分:3)

您将从find方法返回self.new。这是GenreInfluence的一个新实例,带有一组新的实例变量。

答案 2 :(得分:1)

怎么样

class GenreInfluence

@@neo ||= Neography::Rest.new()
attr_accessor :node

def initialize(node_id = nil)
    if (node_id.nil?) then
        @node = @@neo.create_node
    else
        @node = @@neo.get_node(node_id)
    end
end

def find(node_id)
    @node = @@neo.get_node(node_id)
end

def get_hash
  @node
end

end

然后

theInstance = GenreInfluence.new()
theInstance.get_hash

theInstance1 = GenreInfluence.new(20)
theInstance1.get_hash

theInstance2 = GenreInfluence.new()
theInstance2.get_hash
theInstance2.find(20)
theInstance2.get_hash