【问题标题】:How can I "require" code from another .rb file like in PHP?如何从另一个 .rb 文件中“要求”代码,例如 PHP?
【发布时间】:2015-12-05 20:41:58
【问题描述】:

从 PHP 背景开始使用 Ruby,我习惯于使用 requirerequire_onceincludeinclude_once,它们都有类似的效果,但关键是它们继续使用处理代码在调用include / require 命令的同一范围内

示例:

sub.php

<?php
echo $foo;

main.php

<?php
$foo = 1234;
include('sub.php'); // outputs '1234'

当我第一次开始使用 Ruby 时,我尝试包含 / require / require_relative / 加载其他 .rb 文件,在对它没有按预期工作感到有点沮丧之后,我决定有更好的方法来去分解大文件,而 Ruby 不需要像 PHP 那样表现。

但是,有时我觉得出于测试目的,最好以 PHP 的方式从另一个 .rb 文件加载代码 - 在同一范围内访问所有相同的变量 - 而不必使用 class /实例变量或常量。这可能吗?也许以某种方式使用 proc / binding / 或 eval 命令?

同样,我不主张在开发过程中使用它——但我很好奇它是否可能——如果可以,怎么做?

【问题讨论】:

  • 是否要导入外部 ruby​​ 库?
  • 不是特别的,只是希望能够指向一个文件并在当前范围内运行它的几行代码
  • @JuanjoSalvador: load 没有这样做 - 它只提供了一个选项来防止 included 文件污染 includes的命名空间> 文件。

标签: ruby include eval require proc


【解决方案1】:

要让代码在同一个绑定中运行,您可以简单地eval 文件内容如下:

example.rb

class Example
    def self.called_by_include
      "value for bar"
    end

    def foo
      puts "Called foo"
    end

    eval( File.read( 'included.rb' ) )
end

Example.new.bar

included.rb

BAR_CONSTANT = called_by_include
def bar
  puts BAR_CONSTANT
end

运行 ruby example.rb 产生输出

柱的值

重要的是eval( File.read( 'included.rb' ) ) 代码,如果您真的需要,可以将其定义为Object 上的类方法,以允许将任意源包含在便利函数中*。常量、类变量等的使用只是显示了在两段源代码之间双向工作的影响。

在任何生产代码中使用它都是不好的做法。 Ruby 为您提供了更好的元编程工具,例如使用 mix-ins、重新打开类、从块中定义方法等。


* 像这样的

class Object
  def self.include_source filename
    eval( File.read( filename ) )
  end
end

example.rb 中的那行代码将变为 just

include_source 'included.rb'

我再次重申这不是一个好主意。 . .

【讨论】:

    【解决方案2】:

    是的,这是可能的,尽管我不建议这样做。这有效:

    includer.rb:

    puts var 
    

    include.rb:

    var = "Hello!"
    
    eval(File.read("include.rb"), binding)
    

    运行这个(Ruby 2.2.1,Ruby 1.9.3)将打印Hello!。它的工作原理很简单:eval 采用一个可选绑定来评估它传递的代码,Kernel#binding 返回当前绑定。

    【讨论】:

      【解决方案3】:

      要在您的代码中导入外部 .rb 文件,我不确定,但我认为它必须是 gem。

      使用require 后跟要导入的gem 的名称。

      例子

      require 'foobar'
      # do some stuff
      

      或者你可以使用load来导入整个rb文件

      load 'foobar.rb'
      # do some stuff
      

      祝你好运,对不起我的英语

      【讨论】:

      • 不,外部文件不必与 gem 相关。它可以是,但不一定是。这个问题比仅仅导入代码要复杂得多,它也询问范围问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2018-03-19
      • 1970-01-01
      • 2010-09-15
      • 2022-01-05
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多