我怎样才能要求"来自另一个.rb文件的代码,如PHP?

时间:2015-09-09 18:42:18

标签: ruby include eval require proc

从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文件加载代码会很好 - 在相同的范围内可以访问所有相同的变量 - 而不必使用类/实例变量或常量。这可能吗?也许以某种方式使用proc / binding /或eval命令?

同样,我并不主张在开发过程中应该使用它 - 但我很好奇是否有可能 - 如果有的话,怎么样?

3 个答案:

答案 0 :(得分:3)

是的,这是可能的,虽然肯定不是我建议做的事情。这有效:

puts var

include.rb

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

Hello!

运行它(Ruby 2.2.1,Ruby 1.9.3)将打印eval。它很简单:Kernel#binding采用可选绑定来评估它传递的代码,if (ModelState.IsValid) { // Success // Save or whatever return RedirectToAction("Foo"); } // Error return View(model); 返回当前绑定。

答案 1 :(得分:2)

要让代码在相同的绑定中运行,您可以简单地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会产生输出

  

bar的值

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

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

*像这样的东西

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

example.rb中的行将变为

include_source 'included.rb'

我再说一遍,这不是一个好主意。 。

答案 2 :(得分:-1)

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

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

实施例

require 'foobar'
# do some stuff

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

load 'foobar.rb'
# do some stuff

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