0

例如

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 无效。命名空间的不同含义是什么?

4

2 回答 2

3

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

您没有Hash像预期的那样向 Ruby 的类添加方法。如果您愿意,请将其移出class HashC1重新运行:代码将按预期执行。

正如您当前的代码一样,假设您将嵌套类命名为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
于 2013-03-07T01:06:03.950 回答
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

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

于 2013-03-07T01:08:10.640 回答