0

我正在使用此处的帖子完成饥饿学院课程: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不带参数运行命令,并且看到当我初始化它时,AttendeeListuser_input_args[0]是一个空数组[],据我所知,它不是零,所以我认为这就是问题所在。当我希望将 args 传递给我的新实例时,我对如何继续有点迷茫AttendeeList。我也不想在我的 Reporter 类中包含默认逻辑,因为这违背了封装在列表中的目的。

编辑:我忘了提到初始化方法的listfile默认值AttendeeList是我正在谈论的参数。

4

1 回答 1

2

您需要进行此更改:

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

解释

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

在你的情况下:

AttendeeList.new

会按您的预期工作,但是

AttendeeList.new(user_input_args[0])

有效地

AttendeeList.new(nil)

参数listfile变为nil

于 2013-09-12T22:19:54.610 回答