获取类/模块名称

Imp*_*vid 5 ruby

有没有更好的方法来获取类/模块名称,即Cfrom A::B::CBfromA::B::CAFrom A::B::C。下面的代码使用 string 和 split 来获取"Stegosaurus"from Cowsay::Character::Stegosaurus,如何去掉string 和 split?

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"
Run Code Online (Sandbox Code Playgroud)

And*_*eko 4

我认为核心/标准库中没有任何东西可以处理这个问题。

作为自定义书面方法的替代方案,始终有activesupport

require 'active_support/core_ext/string/inflections'
Cowsay::Character::Stegosaurus.name.demodulize
#=> "Stegosaurus"
Cowsay::Character::Stegosaurus.name.deconstantize
#=> "Cowsay::Character"
Run Code Online (Sandbox Code Playgroud)

这些方法的实现如下:

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
Run Code Online (Sandbox Code Playgroud)

如果对更多方法感兴趣,请查看文档。

至于

AA::B::C

如果你拥有require整个activesupport,你会得到一堆Module方法,包括parent

require 'active_support'
Cowsay::Character::Stegosaurus.parent
#=> Cowsay
Run Code Online (Sandbox Code Playgroud)

如果您不打算广泛使用它,我建议只从中获取所需的方法activesupport并将其放入某个帮助程序中,因为将其全部加载可能是一种矫枉过正。

  • 如果您需要的话,提取有用的方法是个好点。这就是开源的好处:如果需要,您可以随时借用部件。 (2认同)