首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取类/模块名称

获取类/模块名称
EN

Stack Overflow用户
提问于 2016-10-23 21:02:14
回答 1查看 2.1K关注 0票数 5

是否有更好的方法获取类/模块名称,即从A::B::C获取A::B::C、从A::B::C获取B和从A::B::C获取A。下面的代码使用字符串和拆分从"Stegosaurus"获得Cowsay::Character::Stegosaurus,如何消除字符串和拆分?

代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

发布于 2016-10-23 21:03:26

我不认为在核心/标准库中有什么可以处理的。

作为自定义编写方法的替代方案,始终存在activesupport

代码语言:javascript
复制
require 'active_support/core_ext/string/inflections'
Cowsay::Character::Stegosaurus.name.demodulize
#=> "Stegosaurus"
Cowsay::Character::Stegosaurus.name.deconstantize
#=> "Cowsay::Character"

这些方法的实现如下:

代码语言:javascript
复制
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

代码语言:javascript
复制
require 'active_support'
Cowsay::Character::Stegosaurus.parent
#=> Cowsay

如果您不打算广泛使用它,我建议您从activesupport中获取所需的方法,并将其放入某个助手中,因为将其全部加载可能会导致过度使用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40207762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档