为什么红宝石“需要”不是更细粒度的?

时间:2017-05-28 22:03:55

标签: python ruby node.js

说明性示例

在b.rb文件中,我有以下两个类:Dog和Cat。

在ruby中,要使用b.rb文件中定义的类Dog,我必须要求b.rb:

require 'b'

puts Dog.new.bark

但即使我不需要Cat,也会定义它,因为已加载了所需文件中的所有类。

问题

所以我的问题是:为什么Ruby中没有一种只需要部分文件的方式?

有没有理由认为它在Ruby中不被认为是必要的,或者是否包含在该语言未来的某些路线图中?

在python中,他们有from module import MyClass表单,它允许导入文件选择要导入的内容,而在NodeJS世界中他们有module.export表单,它允许导入文件选择要导出的内容。

在我看来,Python和NodeJS在这方面要灵活得多。红宝石选择的权衡是什么?

其他问题:如何调用python / nodeJS机制(选择性导入?)?

2 个答案:

答案 0 :(得分:3)

这就是require的工作原理:require运行文件。就是这样。它不会做更多的事情。

如果你想为Ruby添加一个模块系统,那将是对Ruby工作方式的巨大改变。

不要在同一个文件中定义不相关的类。

答案 1 :(得分:0)

Jörgs answer之外:您可以在ruby中使用模块。

一个例子。您的b.rb看起来像是:

module Cats
  class Cat
    def meouw
      puts 'meouw'
    end
  end

end

module Dogs
  class Dog
    def bark
      puts 'wuff wuff'
    end
  end
end

您的脚本如下:

require_relative 'b'

include Dogs
puts Dogs::Dog.new.bark #->wuff wuff
puts Dog.new.bark #->wuff wuff

puts Cats::Cat.new.meouw  #-> meouw
puts Cat.new.meouw  #-> Exception uninitialized constant Cat (NameError)

详细情况:

require_relative 'b'

您阅读了该文件。这将执行文件b.rb中的所有内容(它定义类)。

include Dogs

您是否将模块Dogs加载到实际范围中。课程Dog现已可用。

puts Dogs::Dog.new.bark #->wuff wuff
puts Dog.new.bark #->wuff wuff

您可以在模块Dog的范围内使用课程Dogs,也可以直接使用它。

puts Cats::Cat.new.meouw  #-> meouw

您还加载了课程Cats::Cat,您可以使用它。

puts Cat.new.meouw  #-> Exception uninitialized constant Cat (NameError)

班级Cat不在全球范围内(你从未做过import Cats),所以你得到了一个例外。

最后一个警告:b.rb的定义是错误的编码。通常,您会创建dog.rbcat.rb。您可以要求这些课程独立。