2014-03-07 39 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