获取类/模块名称

时间:2016-10-23 21:02:15

标签: ruby

是否有更好的方式来获取类/模块名称,C来自A::B::CB来自A::B::CA来自{{1} }}。以下代码使用string和split从A::B::C获取"Stegosaurus",如何取消字符串和拆分?

Cowsay::Character::Stegosaurus

谢谢

1 个答案:

答案 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中获取所需的方法并将其放入一些帮助程序,因为加载它可能是一种过度杀伤。