有没有更好的方法来获取类/模块名称,即Cfrom A::B::C、BfromA::B::C和AFrom 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)
我认为核心/标准库中没有任何东西可以处理这个问题。
作为自定义书面方法的替代方案,始终有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)
如果对更多方法感兴趣,请查看文档。
至于
A从A::B::C
如果你拥有require整个activesupport,你会得到一堆Module方法,包括parent:
require 'active_support'
Cowsay::Character::Stegosaurus.parent
#=> Cowsay
Run Code Online (Sandbox Code Playgroud)
如果您不打算广泛使用它,我建议只从中获取所需的方法activesupport并将其放入某个帮助程序中,因为将其全部加载可能是一种矫枉过正。
| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |