【发布时间】:2014-04-13 00:31:19
【问题描述】:
我对这个主题做了很多研究,但在我尝试的每一种情况下,哈希值似乎都被替换了。在此人选择输入新 ID 后,我希望将下一个人的姓名和年龄添加到哈希中。有人可以向我解释为什么要替换键和值吗?
class Person
def initialize(name, age)
if name != nil || age != nil
if @people != nil
@people[name.__id__] = age.__id__
else
@people = {name => age}
end
else
puts "Invalid credentials."
end
end
attr_reader :people
end
class MainInit
def initialize()
options = ["y", "yes", "n", "no"]
choice = "y"
while choice.downcase == "y" || choice.downcase == "yes"
p "Enter Name:"
inputname = gets.chomp
p inputname
p "Enter Age:"
inputage = gets.chomp
p inputage
person = Person.new(inputname, inputage)
p person.people
p "Enter another ID?"
choice = gets.chomp
until options.include? choice.downcase
p "Invalid Choice"
p "Enter another ID?"
choice = gets.chomp
end
end
end
end
MainInit.new
【问题讨论】:
-
@people是一个实例变量,因此每个实例都有一个。每个只包含一个键/值对。我猜您想将与所有实例变量关联的名称和年龄存储在@people中。如果是这样,您需要将@people设为类实例变量(或使用类变量,如@@people)。 -
你需要重组你的类,因为你想保持状态,你需要将
attr_reader :people更改为attr_accessor :people,这样你就可以改变人员哈希的结构,我也不认为你的使用__id__是正确或必要的,将MainInit的initialize方法中的所有逻辑移动到另一个方法中,只留下@people = Person.new(nil, nil),然后你可以调用你创建的新方法例如MainInit.new.new_method而不是MainInit.new在脚本末尾 -
我很快就会给你另一个答案。