9 Stimmen

Kann ich von einem erforderlichen Skript in Ruby auf die DATA zugreifen?

Ist es möglich, auf den Text nach __END__ in einer anderen Ruby-Datei als dem "Hauptskript"?

Zum Beispiel:

# b.rb
B_DATA = DATA.read
__END__
bbb

.

# a.rb
require 'b'
A_DATA = DATA.read
puts 'A_DATA: ' + A_DATA
puts 'B_DATA: ' + B_DATA
__END__
aaa

.

C:\Temp>ruby a.rb
A_DATA:
B_DATA: aaa

Gibt es eine Möglichkeit, an die "bbb" von b.rb zu gelangen?

6voto

James A. Rosen Punkte 62226

Leider ist die DATA wird gesetzt, wenn das Skript "main" geladen wird. Ein paar Dinge, die helfen könnten:

Sie kann zumindest erhalten A_DATA korrekt zu sein. Kehren Sie einfach die Reihenfolge der ersten beiden Operationen in a.rb :

# a.rb
A_DATA = DATA.read
require 'b'
...

Sie können die B_DATA richtig zu sein, wenn man sich ein wenig anstrengt:

# load_data_regardless_of_main_script.rb
module LoadDataRegardlessOfMainScript
  def self.from(file)
    # the performance of this function could be
    # greatly improved by using a StringIO buffer
    # and only appending to it after seeing __END__.
    File.read(file).sub(/\A.*\n__END__\n/m, '')
  end
end

# b.rb:
require 'load_data_regardless_of_main_script'
B_DATA = LoadDataRegardlessOfMainScript.from(__FILE__)

4voto

glenn jackman Punkte 221248

Implementierung des Vorschlags von @James, StringIO zu verwenden:

require 'stringio'
module LoadDataRegardlessOfMainScript
  def self.from(filename)
    data = StringIO.new
    File.open(filename) do |f|
      begin
        line = f.gets
      end until line.match(/^__END__$/)
      while line = f.gets
        data << line 
      end
    end
    data.rewind
    data
  end
end

Dann wird b.rb zu

require 'load_data_regardless_of_main_script'
B_DATA = LoadDataRegardlessOfMainScript.from(__FILE__).read

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X