在没有明确提及其名称空间的情况下引用类

时间:2014-01-08 11:07:03

标签: ruby namespaces

我在几个模块中有一个类: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

2 个答案:

答案 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