空数组搞乱默认参数值

时间:2013-09-12 20:53:33

标签: ruby oop

我正在使用帖子点击饥饿学院课程:http://jumpstartlab.com/news/archives/2013/09/03/scheduling-six-months-of-classes

我在这里找到的EventReporter项目:http://tutorials.jumpstartlab.com/projects/event_reporter.html

到目前为止,我已经构建了一个简单的CLI,它要求输入有效命令,并使用该命令接受其他参数。我现在只在加载功能上工作,我在listfile的初始化方法中设置默认AttendeeList变量时遇到了一些麻烦。这是迄今为止的代码:

require 'csv'

class Reporter
    def initialize()
        @command = ''
        loop()
    end

#Main reporter loop
   def loop
    while @command != 'quit' do 
        printf "Enter a valid command:"
        user_command_input = gets.chomp
        user_input_args = []
        @command = user_command_input.split(" ").first.downcase
        user_input_args = user_command_input.split(" ").drop(1)
        #DEBUG - puts @command
        #DEBUG - puts user_input_args.count

        case @command
        when "load"
            attendee_list = AttendeeList.new(user_input_args[0])
        when "help"
            puts "I would print some help here."
        when "queue"
            puts "I will do queue operations here."
        when "find"
            puts "I would find something for you and queue it here."
        when "quit"
            puts "Quitting Now."
            break
        else
            puts "The command is not recognized, sorry. Try load, help, queue, or find."
        end

    end
   end

 end

class AttendeeList
    def initialize(listfile = "event_attendees.csv")
        puts "Loaded listfile #{listfile}"
    end
end

reporter = Reporter.new

我正在测试运行没有参数的load命令,当我初始化AttendeeList user_input_args[0] []是一个空数组AttendeeList时,我看到了理解不是零,所以我认为这是问题所在。当我希望将args传递给listfile的新实例时,我对如何继续有点迷失。我也不想在Reporter类中包含默认逻辑,因为这样会破坏封装在列表中的目的。

编辑:我忘了提及AttendeeList初始化方法的{{1}}默认值是我正在讨论的论点。

1 个答案:

答案 0 :(得分:2)

您需要进行此更改:

def initialize(listfile = nil)
  listfile ||= "event_attendees.csv"
  puts "Loaded listfile #{listfile}"
end

解释

事实上,user_input_args[0] nil,但nil对默认参数值没有特殊含义。仅当调用函数时参数省略时才使用默认值。

在你的情况下:

AttendeeList.new

会按预期工作,但

AttendeeList.new(user_input_args[0])

实际上是

AttendeeList.new(nil)

且参数listfile变为nil