新手问题 定义 class 的时候,前面加上:: 是什么意思?

tangmonk · 2014年11月09日 · 最后由 tang_tamg 回复于 2014年11月13日 · 6060 次阅读

初学 ruby, 在学习 ruby_koans,遇到以下问题:

class ::Integer
  def even?
    (self % 2) == 0
  end
end

def test_even_existing_built_in_classes_can_be_reopened
  assert_equal __, 1.even?
  assert_equal __, 2.even?
end

# NOTE: To understand why we need the :: before Integer, you need to
# become enlightened about scope.

但是去掉 :: 也没有区别啊

class Integer
  def even?
    (self % 2) == 0
  end
end

def test_even_existing_built_in_classes_can_be_reopened
  assert_equal __, 1.even?
  assert_equal __, 2.even?
end

# NOTE: To understand why we need the :: before Integer, you need to
# become enlightened about scope.

::表示常量的查找路径

#1 楼 @zlfera 啊。。能不能再清楚点,谢谢:D

你这个::前面省略了 Object 了,如果你把上面的类写在 module 里去试试就不一样了

#1 楼 @zlfera 是向前查找吗? :: Integer 指的就是 Numeric.

但是:

> Fixnum.ancestors
=> [Fixnum, Integer, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]


> ::Fixnum.ancestors
# 加了 :: 应该会查找 Integer 前面的父类吧,但是。。Fixnum 还在。。
=> [Fixnum, Integer, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]

:: 是从顶层开始查找,如果没有 :: 就从当前域查找。需不需要 :: 取决于当前域有没有同名常量。

#4 楼 @tangmonk ruby 默认检索常量是按照 scope 的顺序层层向外,最后才会顺着继承顺序向上查找。

class A1
end
class A2 < A1
end
class A3 < A2
  class B1
  end
  class B2 < B1
  end
  class B3 < B2
    class C1
    end
    class C2 < C1
    end
    class C3 < C2
      p(Const)
    end
  end
end

这个例子中的查找顺序是 C3-B3-A3-TOPLEVEL-C2-C1

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