-1

如果我有一个文件model.rb

require 'foo.rb'
require 'foo/bar.rb'

class Model
  def self.foo
    Foo.new
  end

  def bar
    Foo::Bar.to_s
  end

  Foo::Bar::Baz.class_does_not_exist
end

如何解析此文件以返回有效的类引用?例如,如果FooandFoo::Bar在其他地方定义,但Foo::Bar::Bazis not,那么我想要类似的东西:

parse_for_valid_class_references(File.open('model.rb', 'rb'))
# => [Foo, Foo::Bar]
4

1 回答 1

0

一种方法是执行一个 shell 脚本,该脚本运行一个单独的 ruby​​ 进程,需要该文件,检查添加了哪些常量,然后打印它。

如果您有文件 1.rb:

class Foo; end

然后你可以在别处写这个 ruby​​ 代码:

require 'json'
def constants_added_by_file(path)
  cmd = <<-RB
    require 'json'
    consts = Object.constants
    require '#{path}'
    puts((Object.constants - consts).to_json)
  RB
  JSON.parse `ruby -e "#{cmd}"`
end

puts constants_added_by_file('./1.rb')
# => Foo
于 2017-03-30T04:26:39.127 回答