例如
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没有。命名空间的不同含义是什么?
答案 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
没有基于名称空间的类混合。它们是分开的。