ruby 从数组中检索输入

s4n0splo  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(118)

我有我的系统类

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

我有一个方法可以将多个system示例添加到数组中

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

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

oxalkeyp

oxalkeyp1#

用途

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

而不是

systemArray.insert(systeminstance)

另外,请看一下Ruby style guide
编辑:只是为了展示如何以Ruby风格的方式实现同样的功能(未测试)。正如你所看到的,我删除了超过80%的代码。这样的代码更面向对象,功能更强大,更干净,而且会让你有更少的bug。

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
ffdz8vbo

ffdz8vbo2#

首先,这是一个非常不地道的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

不要把你以前教过的习语带到你正在学习的新语言中。
反正这个坏了,没有Array#insert这种方法

systemArray.insert(systeminstance)

请将其更正为

systemArray << systeminstance

其他悲伤

  • Ruby是动态类型化的,所以不要给变量添加类型名称:systemArraysysteminstance应分别称为systemssystem
  • Ruby不使用camelCase:即使systemArray是合适的变量名,它也应该是system_array。方法名也是如此。setSystemName应该是system_name=

相关问题