为什么ruby“要求”不是更精细?

说明性的例子

在文件b.rb中我有以下两个类:狗和猫。

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

require 'b' puts Dog.new.bark 

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

这个问题

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

在Ruby中是不是有必要考虑这个问题,还是将它包含在语言未来的一些路线图中?

在Python中,他们有from module import MyClassforms,它可以让导入文件select要导入,并在module.export世界,他们有module.export ,它可以让导入的文件select要导出。

在我看来,Python和NodeJS在这方面更加灵活。 ruby的select有什么权衡?

附加问题:如何调用python / nodeJS机制( select性导入 ?)?

这就是require工作方式: require运行文件。 而已。 除此之外,它什么也不做。

如果你想添加一个模块系统到Ruby,这将是一个巨大的变化,以Ruby的工作方式。

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

除了Jörgs的回答 :你可能会在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加载到实际范围内。 class级Dog现在可用。

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

您可以在模块Dogs的范围内使用类Dog ,或者您可以直接使用它。

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

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

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

Cat类不在全局范围内(你从来没有做过import Cats ),所以你会得到一个exception。

最后一个警告: b.rb的定义是错误的编码。 通常你创build一个dog.rb和一个cat.rb 你可以要求独立的类。