2013-11-02 3 views
-1

Я пытаюсь написать простую программу командной строки, которая позволяет мне отслеживать, сколько раз я отвлекаюсь во время учебной сессии.Именование нового файла с меткой времени?

У меня ошибка аргумента при запуске этого кода, так как у моего file.open есть недопустимые аргументы. Если я хочу назвать каждый файл new_session с отметкой времени, что было бы простым решением?

def first_question 
    puts "Would you like to start a new session?" 
    answer = gets.chomp 
    answer = answer.downcase 

    if answer == "yes" 
     new_session 
    else 
     puts "Ok. Would you like to review a previous session?" 
     prev_session = gets.chomp 
     prev_session.downcase 
     if prev_session == "yes" 
      #GET AND REVIEW PREVIOUS SESSIONS 
     elsif prev_session == "no" 
      puts "Well if you don't want a new session, and you don't want to review your old sessions, then you're SOL." 
     else 
      "That's not an acceptable response." 
      first_question 
     end 
    end 
end 

def new_session 
    distractions = 0 
    d = File.open("Session"+Time.now.to_s , 'w'){|f| f.write(distractions) } 


    puts "What would you like to do (add track(s) or review tracks)?" 
    request = gets.chomp 
    request.downcase  
    if request == "add track" 
     distractions = distractions.to_i + 1 
     puts "You have #{distractions} tracks in this session." 
    elsif request == "add tracks" 
     puts "How many times have you been distracted since we last met?" 
     answer = gets.chomp 
     distractions = distractions.to_i + answer.to_i 
     puts "You have #{distractions} tracks." 
    elsif request == "review tracks" 
     puts distractions 
    end 
    File.open(d , 'w') {|f| f.write(distractions) } 
end 

first_question 
+0

Может кто-нибудь сказать мне, почему это заслуживает понижения, в то время как ответ, который даже не отвечает на вопрос, получает преимущество? –

ответ

0

У вас есть два File.open заявления:

d = File.open("Session"+Time.now.to_s , 'w'){|f| f.write(distractions) } 

и:

File.open(d , 'w') {|f| f.write(distractions) } 

Ваш код ошибки сказать вам, какой из них является неправильным, но, глядя на них, я бы скажем, это второй.

d будет присвоен результат блока для первого File.open, которая собирается быть результатом f.write(distractions):

В File.open документы говорят:

Значение блока будет вернулся из File.open.

В File.write документы говорят:

Возвращает число записанных байтов.

В результате, вы назначаете d количество байт, а затем пытается создать файл с целым числом для файла, который является ошибкой, так как имя файла MUST быть строкой.

Это приводит к большей проблеме, то есть ваш код не имеет смысла.

  • d = File.open("Session"+Time.now.to_s , 'w'){|f| f.write(distractions) } пишет 0 в файл, созданный "Session"+Time.now.to_s.
  • request.downcase преобразует содержимое request в нижний регистр и сразу же отбрасывает его. Возможно, вы имели в виду request.downcase!, но было бы лучше написать:

    request = gets.chomp 
    request.downcase  
    

    В:

    request = gets.chomp.downcase 
    
  • distractions = distractions.to_i + 1? distractions уже 0 который является Fixnum. Вы конвертируете Fixnum в целое число, используя to_i, затем добавляете 1 к нему.Просто сделать:

    distractions += 1 
    
  • distractions = distractions.to_i + answer.to_i должно быть:

    distractions += answer.to_i 
    
  • File.open(d , 'w') {|f| f.write(distractions) }, потому что это пытается писать в файл с именем целого, а не обновит исходный файл. Если это сработает, оно будет записываться в совершенно новый файл, что приведет к перезаписи ранее созданного файла, что было результатом записи на диск одного 0. Вместо этого d должно быть именем ранее созданного файла.

Рассмотрим это:

def new_session 

    distractions = 0 

    puts "What would you like to do (add track(s) or review tracks)?" 
    request = gets.chomp.downcase 

    case request 
    when "add track" 
    distractions += 1 
    puts "You have #{distractions} tracks in this session." 

    when "add tracks" 
    puts "How many times have you been distracted since we last met?" 
    distractions += gets.chomp.to_i 
    puts "You have #{distractions} tracks." 

    when "review tracks" 
    puts distractions 
    end 

    File.write("Session" + Time.now.to_s, distractions) 
end 

Этот код чище, и имеет смысл в настоящее время.

+0

Извините за плохой код, я довольно новичок в этом. Я попытался реализовать ваш улучшенный метод, но при запуске кода я все еще получаю недопустимую ошибку аргумента. 'ERRNO :: EINVAL' –

1

Большая часть вашего кода грязная и избыточная. Проблема вы имеете в виду, однако, приходит отсюда:

d = File.open("Session"+Time.now.to_s , 'w'){|f| f.write(distractions) } 

d будет количество байтов, записанных в файл и, таким образом Fixnum. Вы не можете открыть Fixnum, который вы пытаетесь сделать в последней строке функции.

Далее

request = gets.chomp 
request.downcase 

Вторая линия здесь ничего не делает.

Смежные вопросы