2011-03-04 219 views
2

我有一種感覺,我在這裏錯過了很簡單的東西。我有一個與外部服務相關的課程。我想通過調用create方法或find方法來實例化它。這兩種方法都會通過創建節點或找到它來使用散列填充實例變量「@node」。在Ruby中實例化一個類並填充實例變量

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 

就返回nil。爲什麼散列沒有存儲在實例變量中!?

回答

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 
+0

謝謝,這將很好地工作。有時我的大腦只是放棄了;) – Samuel 2011-03-04 06:45:06

+0

+1打我衝。 – jdl 2011-03-04 06:47:27

3

您正在從查找方法返回self.new。這是帶有一組實例變量的GenreInfluence的新實例。

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