我经常需要获取对象的纯类名,如下代码:
class Foo
class Bar
end
end
obj = Foo::Bar.new
puts obj.class.name # It shows "Foo::Bar", while what I want is just "Bar"
我知道它可以通过obj.class.name.split('::')。last完成,但是,不应该有一个只返回“ Bar”的方法吗?
在Ruby中,类实际上没有“名称”。类是一个像其他任何对象一样的对象,它像其他任何对象一样被分配给变量。类没有名称,就像数字或字符串没有名称一样。
举个例子:
foo = Class.new
Bar = foo
Baz = foo
Bar = nil
remove_const :Bar
在此示例中,类的“名称”应该是什么?
嗯,有是一个名为方法name
的Module
类。它的作用如下:如果第一次将类对象分配给一个常量,则该常量的名称(请注意,即使这是一个模糊的概念!)也将成为该类的名称,否则该名称将只是是nil
。
扩展上面的示例:
foo = Class.new
foo.name
# => nil
Bar = foo
foo.name
# => 'Bar'
Bar.name
# => 'Bar'
Baz = foo
Baz.name
# => 'Bar'
Bar = nil
remove_const :Bar
foo.name
# => 'Bar'
这是另一个例子:
foo = Class.new
Bar = foo
Baz = foo
class Baz
class Quux; end
Xyzzy = Quux
end
foo::Xyzzy.name
# => 'Bar::Quux'
请注意,即使Quux
在内部定义Baz
并通过foo::Xyzzy
它进行访问Bar::Quux
,其名称仍会打印。
另外,两个不同的类可以具有相同的名称:
Foo = Class.new
Bar = Foo
Foo = nil
remove_const :Foo
Foo = Class.new
Baz = Foo
Foo = nil
remove_const :Foo
Bar.name
# => Foo
Baz.name
# => Foo
Bar == Baz
# => false
类的“名称”只是对人类读者的调试帮助,您永远不要将其用于其他任何用途,也不要以编程方式使用它(甚至取决于字符串的特定结构)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句