引用一个类而不显式提及它的命名空间

GMA*_*GMA 3 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
Run Code Online (Sandbox Code Playgroud)

下面的事情有可能吗?

include This::Is::A::Long
ClassName.do_something
ClassName.do_something_else
ClassName.do_something_different
Run Code Online (Sandbox Code Playgroud)

Bea*_*rtz 5

Ruby 没有 等价物C++ using namespace,如果不在正确的命名空间中,则无法引用类,但您始终可以将其设为变量,因为类也是对象

long_class = This::Is::A::Long::ClassName
long_class.do_something
long_class.do_something_else
# and so on
Run Code Online (Sandbox Code Playgroud)

编辑

Aninclude不会将您置于正确的命名空间中,它包含您所包含的模块中的方法和类(也就是说,它将模块放入祖先类中),因此肯定不适合您的需求:请考虑以下事项:

module This
  module Is
    module A

      def foo
        puts 'A#foo'
      end

      def bar
        puts 'A#bar'
      end

      class ClassName
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,您可能不想This::Is::A::ClassName在另一个类中编写,比方说:

class C
  def foo
    puts 'C#foo'
  end
end

class B < C
  include This::Is::A
end
Run Code Online (Sandbox Code Playgroud)

现在,B.new.foo还是拿出C#foo来吧?错误的。由于您包含了该模块,该方法已被覆盖。