我怎样才能像 PHP 那样从另一个 .rb 文件中 "require" 编码?
How can I "require" code from another .rb file like in PHP?
从 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_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 当前绑定。
从 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_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 当前绑定。