Ruby [新手] 关于 ModuleA::ClassA = ModuleA::ClassB 的问题

kgra · 2014年04月03日 · 最后由 kgra 回复于 2014年04月03日 · 1872 次阅读

在看一个项目的源码的时候,看到了下面的代码

module ModuleA 
  class ClassA

  end
end
module ModuleA
  class ClassB

  end
end
ModuleA::ClassA = ModuleA::ClassB

我大概知道这是将一个类赋给了另外一个类,但是详细内容还不清楚,也没查到,所以谁能帮忙解答下?

  1. 问题是什么?
  2. 什么项目?

#1 楼 @Rei 不是很清楚这种用法,这种用法如果我创建个 ClassA 的对象,那么是不是实际上创建的是 ClassB? 换句话说,在经过下面代码之后,是不是 ClassA 的定义就变成了 ClassB 的

ModuleA::ClassA = ModuleA::ClassB

#1 楼 @Rei 项目是淘宝的 AutoMan

感觉只是把 ModuleA::ClassA 像个 pointer 一样指向 classB....

胡说的...无责任飘过

#4 楼 @karmue #2 楼 @Rei 我验证过,跟我想的是一样的,知识不知道 ruby 怎么就把类定义给换掉了,比较好奇 下面是我验证的代码

module ModuleA
    class ClassA
        def funca()
            puts "a"
        end
    end
end
module ModuleA
    class ClassB
        def funcb()
            puts "b"
        end
    end
end
ModuleA::ClassA = ModuleA::ClassB

test = ModuleA::ClassA.new

#正确的
test.funcb

#错误的
#test.funca

test.class 显示啥?

8 楼 已删除

Ruby 里面大写开头的变量叫做常量,虽然叫做常量但是可以重复赋值,只是第二次赋值时解析器会输出警告。

类名也是个常量,比如可以动态生成一个类然后赋值给常量

A = Class.new do
  def bar
    "bar!"
  end
end
A.class
#=> Class
A.name
#=> "A"
A.new.bar
#=> "bar!"

跟下面几乎等价(我没研究过区别):

class A
  def bar
    "bar!"
  end
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号