我怎样才能像 PHP 那样从另一个 .rb 文件中 "require" 编码?

How can I "require" code from another .rb file like in PHP?

从 PHP 背景来到 Ruby,我习惯于使用 requirerequire_onceincludeinclude_once 它们都具有相似的效果,但关键是它们继续在调用 include / require 命令的相同范围 中处理代码 .

示例:

sub.php

<?php
echo $foo;

main.php

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

当我第一次开始使用 Ruby 时,我尝试包含 / 需要 / require_relative / 加载其他 .rb 文件,但在我对它无法正常工作感到有点沮丧之后会期望它 我决定有更好的方法来分解大文件并且 Ruby 不需要以与 PHP 相同的方式行事。

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

再说一遍,我并不是提倡在开发过程中使用它 - 但我很好奇它是否可能 - 如果可以的话,怎么做?

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

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

示例

require 'foobar'
# do some stuff

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

load 'foobar.rb'
# do some stuff

祝你好运,抱歉我的英语不好

要在同一绑定中包含代码 运行,您只需 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 产生输出

value for bar

重要的是 eval( File.read( 'included.rb' ) ) 代码,如果您确实需要,可以将其定义为 Object 上的 class 方法,以方便地包含任意源代码功能*。常量、class 变量等的使用仅显示了两段源代码之间的双向影响。

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


* 像这样

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

example.rb 中的行将变为

include_source 'included.rb'

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

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

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 returns 当前绑定。