首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ruby将字符串中的类名转换为实际的类

ruby将字符串中的类名转换为实际的类
EN

Stack Overflow用户
提问于 2010-08-12 09:05:28
回答 6查看 58.6K关注 0票数 97

如何从包含类名称的字符串中调用类?(我想我可以做case/when,但这似乎很难看。)

我这样问的原因是因为我使用的是acts_as_commentable插件和其他插件,这些插件将commentable_type存储为列。我希望能够调用任何特定的可注释类来对其执行find(commentable_id)

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-12 09:08:00

我想你想要的是constantize

这是一个RoR构造。我不知道有没有ruby内核的

票数 142
EN

Stack Overflow用户

发布于 2010-08-12 09:08:26

"Object".constantize # => Object
票数 48
EN

Stack Overflow用户

发布于 2012-03-28 08:13:55

这取决于字符串...

如果它已经具有适当的形状(大小写、复数等),并且将直接映射到对象,则:

Rails:

'User'.constantize # => User

Ruby:

Module.const_get 'User' # => User

但除此之外(注意大小写的不同):

'user'.constantize # => NameError: wrong constant name user

Module.const_get 'user' # => NameError: wrong constant name user

因此,你一定要问...源字符串是单数还是复数(是否引用了表?),是多个单词和AlreadyCamelCased还是is_it_underscored?

对于Rails,您可以使用以下工具:

使用camelize将字符串转换为UpperCamelCase字符串,甚至可以处理下划线和正斜杠:

'object'.constantize # => NameError: wrong constant name object
'object'.camelize # => "Object"
'object'.camelize.constantize # => Object
'active_model/errors'.camelize # => "ActiveModel::Errors"
'active_model/errors'.camelize.constantize # => ActiveModel::Errors

使用classify转换一个字符串,它甚至可以是复数(例如,它可能是一个表引用),以创建一个类名(仍然是一个字符串),然后调用constantize来尝试查找并返回类名常量(请注意,在Ruby class names are constants中):

'users'.classify => "User" # a string
'users'.classify.constantize # => User

'user'.classify => "User" # a string
'user'.classify.constantize # => User

'ham_and_eggs'.classify # => "HamAndEgg"

在POR (Plain Old Ruby)中,你有capitalize,但它只适用于第一个单词:

Module.const_get 'user'.capitalize => User

...otherwise您必须使用条带化、拆分、映射、连接等基本工具来实现适当的操作:

class HamAndEgg end # => nil
Module.const_get ' ham and eggs '.strip.gsub(/s$/,'').split(' ').map{|w| w.capitalize}.join # => HamAndEgg
票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3464007

复制
相关文章

相似问题

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