在不正确的时间列出阵列打印的内容(从Marshall打开数组)

时间:2014-08-09 19:16:59

标签: ruby arrays marshalling

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,所以如果我做错了,请告诉我。如有必要,我可以提供更多代码。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不知道究竟是什么导致了这个问题。

但是,除非变量代表程序本身的状态,否则不要在ruby中使用全局变量。

在此处阅读更多http://ruby.about.com/od/variables/a/Global-Variables.htm

尝试将全局变量更改为实例变量@array。 现在可以在整个班级中看到此变量。或甚至更好的常数。

如果您的班级有多个实例,则可以使用类变量@@array。 现在这个变量可以被这个类的许多实例看到。 注意,ruby程序员试图避免使用类变量。

也不要做array.count.times。请eacheach_with_index