2014-03-07 41 views
1

我的系統類從數組中檢索輸入

class System 
    @os 
    @base 
    @number 
    def setOs(newos) 
     @os = newos 
    end 
    def getOs() 
     return @os 
    end 
    def setBase(newbase) 
     @base = newbase 
    end 
    def getBase() 
     return @base 
    end 
    def setSystemNumber(newnumber) 
     @number = newnumber 
    end 
    def getSystemNumber() 
     return @number 
    end 
end 

,我有我的方法與系統的多個實例添加到一個數組

def readXMLSystems 

    doc = Nokogiri::XML(File.open("/Users/lewisardern/Documents/Security-Simulator/lib/xml/boxesconfig.xml")) 
    # puts doc 
    systeminstance = "" 
    systemArray = [] 

    doc.search('//systems/system').each do |system| 
     systeminstance = System. new 
     number = system.at('@number').text 
     systeminstance.setSystemNumber number 
     os = system.at('@os').text 
     systeminstance.setOs os 
     base = system.at('@basebox').text 
     systeminstance.setBase base 

     systemArray.insert(systeminstance) 
    end 

    return systemArray 
end 

和i。由

調用該方法
sys = readXMLSystems 
puts sys 

怎麼來的我無法讀取XML的代碼? 如果我在循環裏寫吐出

puts systeminstance.getSystemNumber #retrieves input 

1 
2 
3 

我希望能夠有這個陣列內的多個系統,但它似乎並沒有要回來......我要去哪裏錯了?的

systemArray.insert(systeminstance) 

而且

回答

2

使用

systemArray.push(systeminstance) # or systemArray << systeminstance 

,而不是請,看一看的Ruby style guide

編輯:只是爲了展示如何同樣可以在Ruby風格的方式來實現(未測試)。正如你所看到的,我刪除了超過80%的代碼。像這樣的代碼是更多的面向對象,功能,乾淨,並會借給你有更少的錯誤。

System = Struct.new(:os, :base, :number) 

def read_systems_xml 
    filename = "/Users/lewisardern/Documents/Security-Simulator/lib/xml/boxesconfig.xml" 
    doc = Nokogiri::XML(File.open(filename)) 

    doc.search('//systems/system').map do |system| 
     System.new(
      system.at('@os').text, 
      system.at('@basebox').text, 
      system.at('@number').text) 
    end 
end 
+1

那工作,耶穌基督似乎我有很多東西要學。 - 使用你的方法,而不是更清潔。 – Lewis

+0

是的,你可以做到! PS .:前C#開發人員。 –

+0

我更新了它;) – Lewis

1

那麼對於初學者,這是非常不地道的紅寶石

def setOs(newos) 
    @os = newos 
end 
def getOs() 
    return @os 
end 

您不必手工編寫getter/setter方法。明確的return電話很少需要。

這應該使用attr_accessor宏觀

class System 
    attr_accessor :os 
end 

如果你想手工編寫它

class System 

    def os 
    @os 
    end 

    def os= os 
    @os = os 
    end 

end 

每個人都可以反對票,是因爲它實際上並沒有回答這個問題被寫入。但事實仍然是,OP顯然不熟悉Ruby,並可能從他們的學習路徑上進行嚴肅的校正。

不要從以前的教導你學習新的語言帶來的成語。

無論如何,這是壞了。有作爲Array#insert

systemArray.insert(systeminstance) 

糾正此沒有這樣的方法來

systemArray << systeminstance 

其他憂患

  • 的Ruby是動態類型的,所以不用類型的名字添加到您的變量:systemArraysysteminstance應稱爲分別爲和system

  • Ruby不使用camelCase:即使systemArray是一個合適的變量名,它將是system_array。方法名稱也一樣。 setSystemName應該是system_name=

+0

沒有幫助的問題,但這是有益的,歡呼聲。 – Lewis