在Ruby中将字符串从snake_case转换为CamelCase

Loh*_* MV 162 ruby string ruby-on-rails

我正在尝试将名称从蛇案转换为骆驼案.有内置方法吗?

例如:"app_user""AppUser"

(我有一个字符串,"app_user"我想将其转换为模型AppUser).

Ser*_*sev 234

如果你正在使用Rails,String#camelize就是你要找的东西.

  "active_record".camelize                # => "ActiveRecord"
  "active_record".camelize(:lower)        # => "activeRecord"
Run Code Online (Sandbox Code Playgroud)

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

"app_user".camelize.constantize
Run Code Online (Sandbox Code Playgroud)

  • 你应该补充一点,这是对String的Rails补充,它不适用于纯Ruby. (40认同)
  • 在constantizing之前你不需要camelize.请使用`#classify`代替.`"some_namespace/module/class_name".classify =>"SomeNamespace :: Module :: ClassName"` (6认同)
  • @chris #classify:不一样.#classify返回一个字符串,而#constantize在上下文中查找常量(并且确实需要camelize).'active_record'.constantize给出错误,'active_record'.camelize.constantize返回常量ActiveRecord,'active_record'.classify返回字符串'ActiveRecord'.如果你做'no_class'.camelize.constantize你会得到错误(没有这样的常量NoClass),但'no_class'.classify愉快地返回'NoClass'字符串. (5认同)
  • 它被标记为'ruby-on-rails`,所以,我想,这不是问题.但谢谢你的提及. (2认同)

小智 114

这个怎么样?

"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
Run Code Online (Sandbox Code Playgroud)

在这里的评论中找到: 分类Ruby字符串

Wayne Conrad的评论

  • 这是该问题唯一真正的答案之一.不使用Rails库. (11认同)
  • 你真棒,谢谢.我不想只为这么小的任务包含rails库.这很漂亮.:) (10认同)

Har*_*tty 40

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

"app_user".classify # => AppUser
"user_links".classify   # => UserLink
Run Code Online (Sandbox Code Playgroud)

注意:

这个答案特定于问题中给出的描述(它不是特定于问题标题).如果有人试图将字符串转换为驼峰,他们应该使用塞尔吉奥的答案.提问者说他​​想转换app_userAppUser(不App_user),因此这个答案..

  • 对于Rails环境,这是完美的. (4认同)
  • “classify” 的一个重要警告是复数字符串将变成单数...“'age_in_years'.classify” 变为“AgeInYear” (2认同)

Mr.*_*ack 23

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

出于学习目的:

class String
  def camel_case
    return self if self !~ /_/ && self =~ /[A-Z]+.*/
    split('_').map{|e| e.capitalize}.join
  end
end

"foo_bar".camel_case          #=> "FooBar"
Run Code Online (Sandbox Code Playgroud)

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

  • @pguardiario如果轮子被调用*ActiveSupport*,请重新发明它. (6认同)
  • @pguardiario是在我们学习了轮子如何工作之后. (5认同)
  • 难道我们不应该学会不重新发明轮子吗? (2认同)

Uly*_* BN 16

纯Ruby解决方案的基准测试

我采用了纯粹的红宝石代码来实现它的每一种可能性,这里它们是:

以下是所有这些基准测试,我们可以看到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)
Run Code Online (Sandbox Code Playgroud)


mik*_*ike 9

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

AppUser.name.underscore # => "app_user"

或者,如果你已经有一个驼峰案例字符串:

"AppUser".underscore # => "app_user"

或者,如果你想获得表名,这可能是你想要蛇案的原因:

AppUser.name.tableize # => "app_users"