在node.js中你可以写:
var lib = require('lib');
但在Ruby中,require函数只是运行文件中的代码并返回true
。
目前,我使用的是非常脏的解决方案:
main.rb的:
$stuff = []
require './file1.rb'
require './file2.rb'
# and so on
file1.rb:
$stuff << something
等等。
如何消除全局变量的使用?
例如:
main.rb的:
$stuff = []
$stuff << cool_require './file1.rb'
# etc
file1.rb:
exports.what = something
答案 0 :(得分:4)
使用某种语言时最大的错误之一是尝试让语言像其他语言一样工作。
Ruby不是NodeJs,每种语言都内置了该语言独有的功能,无法轻松复制。
换句话说,没有办法在Ruby中实现NodeJS需求行为,因为在Ruby中没有导出的概念。当您需要文件时,所需文件中包含的每个方法/类都可供作用域使用。
在Ruby中,有对象和方法可见性。您必须使方法可见或不可用的方式是将其声明为public或private / protected。
答案 1 :(得分:1)
好吧,首先要考虑Ruby不是Node.js.正如Simone Carletti所说,每种语言都有一些独特的功能。有时从其他语言中获取是好的,但有时它很糟糕。
meth
是方法调用,用于传递使用method
方法的方法:method(:meth)
或将其打包到模块/类中
您可以通过将类/模块分配给某些第二个变量来使用它:
class A;
def self.aa; puts 'aa'; end;
end;
New_a = A;
New_a.aa # aa;
eval
是危险的方法(您可以评估未知代码)
这是你可以做的一种方法。这不是白痴坚韧的。它不是100%安全(eval
)。 :
file1.rb:
Module.new do
def self.meth1
42
end
def self.meth2
'meth2'
end
end
Module.new
因为它返回了您想要的对象。您可以稍后将其分配给变量/常量。 self.meth*
,因此您不必include
,而是立即按照以下方式运行:module_name.meth1()
req.rb:
def cool_require name
eval(File.read name)
end
Some_variable = cool_require('req.rb')
puts Some_variable.meth1 # 42
puts Some_variable.meth2 # meth2
cool_require
读取文件名(参数name
)和eval
uate it(就像你在irb / pry中输入的那样)Some_variable
是不变的。它不会轻易消失。