Действительно ли я могу получить доступ к ДАННЫМ из необходимого сценария в Ruby?

Действительно ли возможно получить доступ к тексту после __END__ в рубиновом файле кроме "основного" сценария?

Например:

# 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

Там какой-либо путь состоит в том, чтобы достигнуть "bbb" от b.rb?

9
задан Chris Perkins 28 January 2010 в 07:47
поделиться

2 ответа

К сожалению, глобальная константа DATA устанавливается при загрузке "основного" скрипта. Несколько вещей, которые могут помочь:

Вы можете по крайней мере получить A_DATA, чтобы быть правильным. Просто переверните порядок первых двух операций в a.rb:

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

Вы можете получить B_DATA, чтобы быть правильным, если вы проходите через немного ригамарола:

# 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__)
6
ответ дан 3 November 2019 в 01:56
поделиться

Реализация доказания @ Джеймса для использования Stringio:

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

Тогда B.rb становится

require 'load_data_regardless_of_main_script'
B_DATA = LoadDataRegardlessOfMainScript.from(__FILE__).read
4
ответ дан 3 November 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: