两个问题,可能是相关的:
我正在从一个YAML文件中检索一些'人'到一个数组,现在我正在尝试从该数组创建类。
然后将这些对象放在一个新数组中。
如果您不考虑上次添加的对象替换之前添加的 all 这一事实,它确实很好。
在我的情况下,我得到五个相同的对象#5副本,我更喜欢看到五个不同的副本。
我的猜测是错误导致我的迭代器中的某个地方从YAML获取所有'人'。
关于常量的“重复使用”,我得到了一些警告: NEWSTR和NEWAL。
getPost = 0
loopa = 0
while loopa < personsInYAML
NEWSTR = TEST.fetch(getPost)
NEWAL = NEWSTR.split(' ')
getPost+=1
puts "*****************************************"
nyloop = loopa+1
puts "PERSON: " + nyloop.to_s + " name: " + NEWAL.fetch(1)
nameToArray = Person.new
outputArray.insert(loopa, nameToArray)
loopa+=1
end
人员级
class Person
def initialize
@name
@age
@length
@weight
@misc
end
def name
name = NEWAL.fetch(1)
return name
end
if NEWAL.include?("age:")
def age
x = NEWAL.index("age:")+1
age = NEWAL.fetch(x)
return age
end
end
if NEWAL.include?("length:")
def length
x = NEWAL.index("length:")+1
length = NEWAL.fetch(x)
return length
end
end
if NEWAL.include?("weight:")
def weight
x = NEWAL.index("weight:")+1
weight = NEWAL.fetch(x)
return weight
end
end
if NEWAL.include?("misc:")
def misc
x = NEWAL.index("misc:")+1
misc = NEWAL.fetch(x)
return misc
end
end
end
答案 0 :(得分:1)
你采用了错误的方法来填充你的Person类。你的循环唯一要做的就是创建全新的Person类并将它们粘贴在一个数组中。它实际上并没有初始化人员类。
看起来你要做的就是使用一个常量(你不保持常量)将信息传递给Person类。但是,Person类中除了方法之外的代码只会运行一次 - 当第一次加载类时,而不是在创建新Person时。
最好更改初始化方法以获取一些参数,并在循环中创建具有适当参数的类。
def initialize(name, age = nil, length = nil, weight = nil, misc = nil)
# assign instance variables here
@name = name
...
end
您似乎正在尝试为实例变量创建动态访问器。这并没有多大意义。只需在所有这些上定义访问器,并处理在调用Person类的任何代码中实例变量为nil的情况。