我有我的系统类
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
我希望能够在这个数组中拥有多个系统,但它似乎没有返回......我哪里出错了?
答案 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是动态类型的,因此不要在变量中添加类型名称:systemArray
或systeminstance
应分别称为systems
和system
。< / p>
Ruby不使用camelCase:即使systemArray
是一个合适的变量名,它也是system_array
。方法名称也是如此。 setSystemName
应为system_name=