Ruby Ruby module 疑问?

zhulinpinyu · 2014年08月12日 · 最后由 awking 回复于 2014年08月13日 · 2282 次阅读

Question:

module A
    class B
        def say_hi
            "Hi"
        end
    end
end

module A
    class C
        def say
            b1 = A::B.new
            p b1.say_hi  # Hi
            b2 = B.new
            p b2.say_hi  # Hi
        end
    end
end


c = A::C.new
c.say

如上示例:

其中在 module A 中A::B.newB.new区别是什么?

module 可以理解为命名空间,B.new 只能在 module A 里面被调用。

在 module A 中A::B.newB.new区别是什么?

A::B.new 是绝对路径 B.new 是相对路径

最终会是这样

module A
    class B
        def say_hi
            "Hi"
        end
    end

    class C
        def say
            b1 = A::B.new  # 这里可以写成b1 =  B.new
            p b1.say_hi  # Hi
            b2 = B.new
            p b2.say_hi  # Hi
        end
    end
end

因为 A B 都在 module A 里面。 @sevk 说的对

A::B.new 是绝对路径 B.new 是相对路径

#1 楼 @Justin #3 楼 @sevk #4 楼 @awking

准确的说,::A::B 才是绝对路径,A::B 和 B 都是相对的。 程序在解析时,当遇到常量后 A 或 B 都是常量(模块),根据常量的查找规则找到对应的常量。 如果想了解常量查找路径,这篇文章讲得最清楚 Everything you ever wanted to know about constant lookup in Ruby http://cirw.in/blog/constant-lookup

我以前也遇到过常量查找的困惑,可以看看这个帖子 https://ruby-china.org/topics/4777

需要 登录 后方可回复, 如果你还没有账号请 注册新账号