Ruby的内部类Hash

时间:2013-03-07 01:00:14

标签: ruby hash inner-classes nested-class

例如

class C1
     class Hash
       def ok?
          return 'nested hash ok'
       end
      end
     def m1
        return Hash.new.ok?
     end
     def m2
        return {}.ok?
     end
end

C1.new.m1有效但C1.new.m2没有。命名空间的不同含义是什么?

2 个答案:

答案 0 :(得分:3)

您只需创建一个名为Hash的新类,嵌套在C1内。

您没有像您期望的那样向Ruby的Hash类添加方法。 如果您需要,请将class Hash移到C1之外并重新运行:代码将按预期执行。

正如您当前的代码所示,假设您将嵌套类命名为MyThing。现在,你不会工作{}.ok?,是吗?

所以回顾一下:

这样可行:

class Hash
   def ok?
    return 'non-nested hash ok'
   end
end
class C1
     def m1
        return Hash.new.ok? #WORKS
     end
     def m2
        return {}.ok? #WORKS
     end
end

这将失败:

class C1
    class MyThing
      def ok?
       return 'nested hash ok'
       end
    end
     def m1
        return MyThing.new.ok? #WORKS
     end
     def m2
        return {}.ok? #FAILS
     end
end

答案 1 :(得分:0)

class C1
  class Hash # defines C1::Hash
    def ok?
      return 'nested hash ok'
    end
  end

  def m1
    return Hash.new.ok? # refers to C1::Hash
  end

  def m2
    return {}.ok? # refers to Hash
  end
end

没有基于名称空间的类混合。它们是分开的。