2013-05-16 5 views
0

У меня есть код, который пытается изменить «false» на «true» в рубиновом файле, но он работает только один раз во время работы скрипта.Переключение true/false: редактирование файла в ruby ​​

toggleto = true 
    text = File.read(filename) 
text.gsub!("#{!toggleto}", "#{toggleto}") 
File.open(filename, 'w+') {|file| file.write(text); file.close} 

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

Larger Контекст:

def toggleAutoAction 

    require "#{@require_path}/options" 

    filename = "#{@require_path}/options.rb" 

    writeToggle(filename, !OPTIONS[:auto]) 

    0 

end 


    def writeToggle(filename, toggleto) 

text = File.read(filename) 
text.gsub!(":auto => #{!toggleto}", ":auto => #{toggleto}") 
File.open(filename, 'w+') {|file| file.write(text); file.close} 

    end 


    def exitOrMenu 

    puts "Are you done? (y/n)" 
    prompt 

    if gets.chomp == 'n' 
     whichAction 
    else 
     exit 
    end 

    end 


    def whichAction 
    if action == 5 
    toggleAutoAction 
    else 
     puts "Sorry, that isn't an option...returning" 
    return 1 
    end 

    exitOrMenu 

    end 
+1

что вопрос? –

+0

- это не файл, который автоматически закрывается после блока, что делает ваш звонок лишним? –

+0

Хорошо, хорошо, но это не решает проблему. – JohnH

ответ

1

Проблема лежит в этом методе:

def toggleAutoAction 
    require "#{@require_path}/options"   # here 
    filename = "#{@require_path}/options.rb" 
    writeToggle(filename, !OPTIONS[:auto]) 
    0 
end 

Рубин не будет загружать options.rb второй раз (т.е. с точно таким же именем пути), следовательно, ваш !OPTIONS[:auto] будет оцениваться только один раз (в противном случае вы получите предупреждение с постоянной константой, если OPTIONS определено в options.rb). См. Документы Kernel#require.

Можно, конечно, делать сумасшедшие вещи, как

eval File.read("#{@require_path}/options.rb") 

, но я не рекомендую (производительность мудрая).

Как отмечалось above, чтение/запись из/в YAML файлов менее болезненным ;-)

+0

Я считаю, что вы __could__ do 'load (" # { @require_path} /options.rb ")' вместо 'eval', но, как сказал @DMKE, лучше всего этого не делать. –

+0

Конечно ... спасибо, что указали это. – JohnH

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