从PHP背景来到Ruby,我过去常常能够使用require
,require_once
,include
或include_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命令?
同样,我并不主张在开发过程中应该使用它 - 但我很好奇是否有可能 - 如果有的话,怎么样?
答案 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
祝你好运,对不起我的英语