将string从snake_case转换为Ruby中的CamelCase

我正试图将一个名字从蛇案转化为骆驼案。 有没有内置的方法?

例如: "app_user""AppUser"

(我有一个string"app_user"我想将其转换为模型AppUser )。

如果您使用的是Rails,那么您需要使用String#camelize 。

  "active_record".camelize # => "ActiveRecord" "active_record".camelize(:lower) # => "activeRecord" 

如果你想得到一个实际的类,你应该使用String#constantize 。

 "app_user".camelize.constantize 

这个怎么样?

 "hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld" 

在这里的评论发现: 分类一个Rubystring

见Wayne Conrad的评论

使用classify 。 它很好地处理边缘情况。

 "app_user".classify # => AppUser "user_links".classify # => UserLink 

注意:

这个答案是特定于问题中给出的描述(它不是特定于问题标题)。 如果有人试图将string转换为驼峰式,他们应该使用塞尔吉奥的答案。 提问者指出,他想将app_user转换为AppUser (而不是AppUser ),因此这个答案..

资料来源: http : //rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method

为了学习的目的:

 class String def camel_case return self if self !~ /_/ && self =~ /[AZ]+.*/ split('_').map{|e| e.capitalize}.join end end "foo_bar".camel_case #=> "FooBar" 

而对于lowercase的变种:

 class String def camel_case_lower self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join end end "foo_bar".camel_case_lower #=> "fooBar" 

我来到这里寻找你的问题的反面,从骆驼案件蛇案件。 使用下划线 (不是十进制):

AppUser.name.underscore # => "app_user"

或者,如果您已经有一个驼峰string:

"AppUser".underscore # => "app_user"

或者,如果你想得到表名,这可能是你为什么想要蛇的情况:

AppUser.name.tableize # => "app_users"

纯Ruby解决scheme的基准

我把所有可能的想法都用纯Ruby代码来实现,在这里它们是:

  • 大写和gsub

     "app_user".capitalize.gsub(/_(\w)/){$1.upcase} 
  • 拆分和地图使用&速记(感谢user3869936的答案)

     "app_user".split('_').map(&:capitalize).join 
  • 分裂和地图(感谢布莱克先生的回答)

     "app_user".split('_').map{|e| e.capitalize}.join 

这里是所有这些的基准,我们可以看到gsub对此很不好。 我用了126 080字。

  user system total real capitalize and gsub : 0.360000 0.000000 0.360000 ( 0.357472) split and map, with &: 0.190000 0.000000 0.190000 ( 0.189493) split and map : 0.170000 0.000000 0.170000 ( 0.171859) 

这里列出的大部分其他方法都是Rails特有的。 如果你想用纯Ruby做这个,下面是我提出的最简洁的方法(感谢@ ulysse-bn的build议改进)

 x="this_should_be_camel_case" x.gsub(/(?:_|^)(\w)/){$1.upcase} #=> "ThisShouldBeCamelCase"