我怎样才能在Ruby中模仿Node.js的require函数?

时间:2013-12-02 22:53:27

标签: ruby modularity

在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

2 个答案:

答案 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
  • 此文件包含具有2种方法的模块。
  • 我正在使用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是不变的。它不会轻易消失。
  • 2最后一行是它的工作原理。公平地说,我记得,这就是node.js需要工作的方式。