为什么ruby“要求”不是更精细?
说明性的例子
在文件b.rb中我有以下两个类:狗和猫。
在ruby中,要使用文件b.rb中定义的类Dog,我必须要求b.rb:
require 'b' puts Dog.new.bark
但是,即使我不需要Cat,也会定义它,因为所需文件中的所有类都已加载。
这个问题
所以我的问题是:为什么Ruby中没有一种方法只需要文件的一部分?
在Ruby中是不是有必要考虑这个问题,还是将它包含在语言未来的一些路线图中?
在Python中,他们有from module import MyClass
forms,它可以让导入文件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
你可以要求独立的类。
- 有关路由和创build新对象的Mongoose问题
- 在Node中调用child_process.exec,就像在特定的文件夹中执行一样
- var azure = require('azure-storage'); 不工作
- 为nodejs中的多个域启用Access-Control-Allow-Origin
- 将asynchronous函数转换为同步函数
- 深“NPM更新”?
- 为什么node.js突然使用更less的内存?
- Heroku + MongoLab插件与Node.js应用程序连接错误 – 错误:连接ECONNREFUSED 127.0.0.1:27017
- RESTful Express Mongoose&Backbone – Backbone model.remove()不起作用