在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机制(选择性导入?)?
答案 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.rb
和cat.rb
。您可以要求这些课程独立。