是否有更好的方式来获取类/模块名称,C
来自A::B::C
,B
来自A::B::C
,A
来自{{1} }}。以下代码使用string和split从A::B::C
获取"Stegosaurus"
,如何取消字符串和拆分?
Cowsay::Character::Stegosaurus
谢谢
答案 0 :(得分:4)
我认为在核心/标准库中没有任何处理方法。
作为自定义书面方法的替代方法,始终有activesupport
:
require 'active_support/core_ext/string/inflections'
Cowsay::Character::Stegosaurus.name.demodulize
#=> "Stegosaurus"
Cowsay::Character::Stegosaurus.name.deconstantize
#=> "Cowsay::Character"
这些方法实现如下:
def demodulize(path)
path = path.to_s
if i = path.rindex('::')
path[(i+2)..-1]
else
path
end
end
def deconstantize(path)
path.to_s[0, path.rindex('::') || 0] # implementation based on the one in facets' Module#spacename
end
如果对更多方法感兴趣,请查看into docs。
至于
A
来自A::B::C
如果您require
整个activesupport
,您将获得大量Module
方法,包括parent
:
require 'active_support'
Cowsay::Character::Stegosaurus.parent
#=> Cowsay
如果您不打算广泛使用它,我建议您从activesupport
中获取所需的方法并将其放入一些帮助程序,因为加载它可能是一种过度杀伤。