我在几个模块中有一个类:This::Is::A::Long::ClassName
。在一个脚本或方法中,有没有办法让ClassName
可用而不必引用命名空间?而不是写:
This::Is::A::Long::ClassName.do_something
This::Is::A::Long::ClassName.do_something_else
This::Is::A::Long::ClassName.do_something_different
是否可能如下所示?
include This::Is::A::Long
ClassName.do_something
ClassName.do_something_else
ClassName.do_something_different
答案 0 :(得分:4)
Ruby没有等同于C++
using namespace
,并且你不能在没有正确的命名空间的情况下引用一个类,但你总是可以把它变成一个变量,因为一个类也是一个对象
long_class = This::Is::A::Long::ClassName
long_class.do_something
long_class.do_something_else
# and so on
修改强>
include
不会将您置于正确的命名空间中,它包含方法&您所包含的模块中的类(即,它将模块放在类祖先中),因此肯定不适合您的需要:请考虑以下事项:
module This
module Is
module A
def foo
puts 'A#foo'
end
def bar
puts 'A#bar'
end
class ClassName
end
end
end
end
现在,你可能不想在另一个班级写This::Is::A::ClassName
,让我们说:
class C
def foo
puts 'C#foo'
end
end
class B < C
include This::Is::A
end
现在,B.new.foo
仍然发出C#foo
,对吗?的错误的即可。由于您包含了该模块,因此该方法已被覆盖。
答案 1 :(得分:3)
如果您使用命名空间模块,那么您发布的代码应该可以使用,请参阅此示例:
module Long
module Name
class ClassName
end
end
end
ClassName
# => ... uninitialized constant ClassName (NameError)
include Long::Name
ClassName
# => Long::Name::ClassName