Ruby新手在这里。我正在为一个房东申请上课。
这个想法是能够做一些房东可以做的功能来管理他们的财产。为此,我有一个主菜单方法,其功能如下:
def main_menu
puts "Please choose an option from the following menu:"
puts " 1. List All Apartments"
puts " 2. View Apartment Details"
puts " 3. Add an Apartment"
puts " 4. Add a Tenant"
puts " 5. Evict a Tenant"
puts " 6. Quit"
input = gets.chomp
case input
when "1"
list
when "2"
view(select_apt)
when "3"
add
when "4"
tenant(select_apt)
when "5"
evict(select_apt)
when "6"
File.open('listing.txt', 'w') {|file| file.truncate(0) }
File.open('listing.txt', 'w') {|file| file.write(Marshal.dump($array))}
else
puts "I'm sorry, that's not a valid option.\n\n"
main_menu
end
end
quit选项(6)中两行的目的是能够检索包含每个单元对象的数组。全局单元数组$ array在程序开头使用:
创建$array = Marshal.load(File.binread('listing.txt'))
最初,我使用内置数组进行测试,一切都按照我预期的方式工作。但是,现在,除List方法外,每个函数都有效:
def list
puts "You have the following apartments:\n"
$array.count.times do |i|
if $array[i].renters.empty?
print "#{$array[i].address}: is #{$array[i].sqft} square feet, has #{$array[i].num_beds} bedrooms and #{$array[i].num_baths} bathrooms. The monthly rent is $#{$array[i].monthly_rent}. \n\n"
else
print "#{($array[i].address)}: "
print "#{view_tenants(i)}"
end
end
main_menu
end
当我通过在主菜单中选择1来调用列表方法时,它将仅列出第一个公寓。奇怪的是,当我尝试退出时,使用" 6",该程序将逐一打印出有关公寓的信息。终端输出显示在此处:
Please choose an option from the following menu:
1. List All Apartments
2. View Apartment Details
3. Add an Apartment
4. Add a Tenant
5. Evict a Tenant
6. Quit
6
500Jane Street: Nicole is the sole tenant at this apartment.
Please choose an option from the following menu:
1. List All Apartments
2. View Apartment Details
3. Add an Apartment
4. Add a Tenant
5. Evict a Tenant
6. Quit
6
5001776, Floor 8: The renters living at the apartment are Jessica, and Jamie.
Please choose an option from the following menu:
1. List All Apartments
2. View Apartment Details
3. Add an Apartment
4. Add a Tenant
5. Evict a Tenant
6. Quit
6
500Please choose an option from the following menu:
1. List All Apartments
2. View Apartment Details
3. Add an Apartment
4. Add a Tenant
5. Evict a Tenant
6. Quit
6
Brandons-MacBook: Brandon $
当我手动设置一个等于我想要的数组时,一切都符合我的预期。此外,如果我选择"查看公寓详情"选项,它正确列出我目前的所有公寓(以便我可以选择一个)。它只是" List All Apartments"给我带来麻烦的选项。这是我第一次使用Marshall,所以如果我做错了,请告诉我。如有必要,我可以提供更多代码。
提前致谢!
答案 0 :(得分:1)
我不知道究竟是什么导致了这个问题。
但是,除非变量代表程序本身的状态,否则不要在ruby中使用全局变量。
在此处阅读更多http://ruby.about.com/od/variables/a/Global-Variables.htm。
尝试将全局变量更改为实例变量@array
。
现在可以在整个班级中看到此变量。或甚至更好的常数。
如果您的班级有多个实例,则可以使用类变量@@array
。
现在这个变量可以被这个类的许多实例看到。
注意,ruby程序员试图避免使用类变量。
也不要做array.count.times
。请each
或each_with_index
。