0

我有一些代码试图在 ruby​​ 文件中将“false”更改为“true”,但它只在脚本运行时工作一次。

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

据我所知,只要我关闭一个文件,之后我应该能够用我之前写的内容来阅读它,从而无论多少次来回更改它。

更大的背景:

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
4

1 回答 1

1

问题在于这种方法:

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

Ruby 不会options.rb第二次加载(即使用完全相同的路径名),因此您!OPTIONS[:auto]只会被评估一次(否则您会得到一个常量已经定义的警告,前提OPTIONS是在 中定义options.rb)。请参阅Kernel#require文档。

当然,你可以做一些疯狂的事情,比如

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

但我不建议这样做(性能方面)。

如上所述从/向 YAML 文件读取/写入文件不那么痛苦;-)

于 2013-05-16T21:49:39.050 回答