是否有更好的方法获取类/模块名称,即从A::B::C获取A::B::C、从A::B::C获取B和从A::B::C获取A。下面的代码使用字符串和拆分从"Stegosaurus"获得Cowsay::Character::Stegosaurus,如何消除字符串和拆分?
require 'cowsay'
x = Cowsay.random_character().class
x.name.split("::")[2]
require 'cowsay'
true
x = Cowsay.random_character().class
Cowsay::Character::Stegosaurus
x.name.split("::")[2]
"Stegosaurus"发布于 2016-10-23 21:03:26
我不认为在核心/标准库中有什么可以处理的。
作为自定义编写方法的替代方案,始终存在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如果对更多方法感兴趣,请看一下变成医生。
至于
A来自A::B::C
如果要require整个activesupport,就会得到一堆Module方法,包括parent
require 'active_support'
Cowsay::Character::Stegosaurus.parent
#=> Cowsay如果您不打算广泛使用它,我建议您从activesupport中获取所需的方法,并将其放入某个助手中,因为将其全部加载可能会导致过度使用。
https://stackoverflow.com/questions/40207762
复制相似问题