4

在 Ruby 中,通过IO 对象__END__任意使用后存储静态文本非常方便:DATA

puts DATA.read # Prints "This is the stuff!"
__END__
This is the stuff!

但是,当我尝试从新类的上下文中引用 DATA 对象时,会出现意外错误(显然在 Ruby 1.9.3 和 2.0 中):

class Foo
  STUFF = DATA.read # <class:Foo>: uninitialized constant Foo::DATA (NameError)
end

class Foo
  STUFF = ::DATA.read # <class:Foo>: uninitialized constant DATA (NameError)
end

知道我怎样才能完成这项工作吗?

4

3 回答 3

8

已经有评论,错误无法确认,Babai还发布了工作示例。

也许你还有另一个问题:

DATA 对应于__END__文档之后的文本,而不是实际的源代码文件。

有用:

class Foo
  STUFF = DATA
  p STUFF.read
end
__END__
This is the stuff!

这里的源代码文件和主文件是一样的。

但是,如果您将其存储为test_code.rb并将其加载到主文件中:

require_relative 'test_code.rb'

然后你得到错误:

C:/Temp/test_code.rb:2:in `<class:Foo>': uninitialized constant Foo::DATA (NameError)
  from C:/Temp/test_code.rb:1:in `<top (required)>'
  from test.rb:1:in `require_relative'
  from test.rb:1:in `<main>'

如果您的主文件再次出现

require_relative 'test_code.rb'

__END__
This is the stuff!

然后该过程与输出一起工作这就是东西!

要回答您的问题:

  • 您不能__END__在库中使用,只能作为主文件的一部分。
  • 请改用 Here-documents - 或将您的数据存储在外部数据文件中。
于 2013-08-29T21:07:47.820 回答
1

我倾向于使用File.read(__FILE__).split("\n__END__\n", 2)[1]而不是DATA.read

于 2018-03-01T16:37:26.690 回答
0

好博客在这里:-Useless Ruby Tricks: DATA and END

这是如何工作的:

class Foo
  def dis
    DATA.read
  end
end 
Foo.new.dis # => "This is the stuff!\n"
__END__
This is the stuff!

class Foo
  STUFF = DATA
  p STUFF.read
end
__END__
This is the stuff!
# >> "This is the stuff!\n"

RUBY_VERSION # => "2.0.0"
class Foo
  p STUFF = DATA.read 
end
__END__
This is the stuff!
# >> "This is the stuff!\n"
于 2013-08-29T19:49:52.527 回答