从数组中检索输入

时间:2014-03-07 00:28:34

标签: ruby xml arrays

我有我的系统类

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

我通过

调用该方法
sys = readXMLSystems
puts sys

为什么我不能阅读XML代码? 如果我在循环中写入它吐出

puts systeminstance.getSystemNumber #retrieves input

1
2
3

我希望能够在这个数组中拥有多个系统,但它似乎没有返回......我哪里出错了?

2 个答案:

答案 0 :(得分:2)

使用

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

而不是

systemArray.insert(systeminstance)

另外,请看一下Ruby style guide

编辑:只是为了展示如何以Ruby样式(未经测试)实现相同目的。正如您所看到的,我删除了超过80%的代码。像这样的代码更多OOP,功能齐全,干净,并且会让你有更少的错误。

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 :(得分:1)

对于初学者来说,这是非常非惯用的Ruby

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应分别称为systemssystem。< / p>

  • Ruby不使用camelCase:即使systemArray是一个合适的变量名,它也是system_array。方法名称也是如此。 setSystemName应为system_name=