当前位置:  开发笔记 > 后端 > 正文

如何在另一个文件中包含Ruby源内联?

如何解决《如何在另一个文件中包含Ruby源内联?》经验,为你挑选了1个好方法。

我有许多Ruby文件,每个文件声明一个Class,但每个文件都可以从命令行运行.

我想将以下功能放在每个文件的底部,尽可能减少重复:

if __FILE__ == $0
  # instantiate the class and pass ARGV to instance.run
end

我的第一直觉是这样做:

# /lib/scriptize.rb:
Kernel.class_eval do
  def scriptize(&block)
    block.call(ARGV) if __FILE__ == $0
  end
end

# /lib/some_other_file.rb:
include 'scriptize'
class Foo
  # ...
end
scriptize { |args| Foo.new.run(args) }

但这不起作用因为__FILE__被评估scriptize.rb,所以它永远不会 Foo.

我想解决方案是字面上内容scriptize.rb,但我不知道语法.我可以使用eval,但这仍然是相当多的重复 - 它不能真正简化为我添加的方法Kernel.



1> kch..:

尝试评估它.

eval(IO.read(rubyfile), binding)

这就是Rails的初始化程序在加载文件时所做的事情config/environments,因为它需要在Rails::Initializer.run块中对它们进行评估.

binding是一个ruby方法,它将返回当前上下文,当传递给eval它时,会使它评估调用环境中的代码.


试试这个:

  # my_class.rb 
  class MyClass
    def run
      puts 'hi'
    end
  end

  eval(IO.read('whereami.rb'), binding)


  # whereami.rb 
  puts __FILE__


  $ ruby my_class.rb 
  my_class.rb

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有