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

时间:2012-03-01 21:33:24

标签: ruby-on-rails ruby string

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

例如:"app_user""AppUser"

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

10 个答案:

答案 0 :(得分:219)

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

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

如果你想获得一个真正的课程,你应该使用String#constantize

"app_user".camelize.constantize

答案 1 :(得分:105)

这个怎么样?

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

在此处的评论中找到:Classify a Ruby string

请参阅Wayne Conrad

的评论

答案 2 :(得分:40)

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

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

注意:

这个答案特定于问题中给出的描述(它不是特定于问题标题)。如果有人试图将字符串转换为驼峰,他们应该使用Sergio的答案。提问者声明他想将app_user转换为AppUser(而不是App_user),因此这个答案就可以了。

答案 3 :(得分: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"

对于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"

答案 4 :(得分:15)

纯Ruby解决方案的基准

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

  • capitalize和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)

答案 5 :(得分:9)

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

AppUser.name.underscore # => "app_user"

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

"AppUser".underscore # => "app_user"

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

AppUser.name.tableize # => "app_users"

答案 6 :(得分:2)

我觉得在这里添加更多答案有点不安。决定采用最可读和最小的纯红宝石方法,无视@ ulysse-bn的漂亮基准。虽然:class模式是@ user3869936的副本,但我在其他任何答案中都没有看到:method模式。

  def snake_to_camel_case(str, mode: :class)
    case mode
    when :class
      str.split('_').map(&:capitalize).join
    when :method
      str.split('_').inject { |m, p| m + p.capitalize }
    else
      raise "unknown mode #{mode.inspect}"
    end
  end

结果是:

[28] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :class)
=> "AsdDsaFds"
[29] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :method)
=> "asdDsaFds"

答案 7 :(得分:1)

红宝石核心本身不支持将字符串从蛇形案例转换为(上部)骆驼案例(也称为帕斯卡案例)。

因此,您需要自己实施或使用现有的gem。

有一个名为 lucky_case 的小红宝石,可让您轻松地将字符串从支持的10多种情况中的任何一种转换为另一种情况:

require 'lucky_case'

# to get upper camel case (pascal case) as string
LuckyCase.pascal_case('app_user') # => 'AppUser'
# to get the pascal case constant
LuckyCase.constantize('app_user') # => AppUser
# or the opposite way
LuckyCase.snake_case('AppUser')   # => app_user

如果愿意,您甚至可以猴子修补String类:

require 'lucky_case/string'

'app_user'.pascal_case # => 'AppUser'
'app_user'.constantize # => AppUser
# ...

有关更多示例和文档,请查看官方存储库:

https://github.com/magynhard/lucky_case

答案 8 :(得分:0)

此处列出的大多数其他方法都是特定于Rails的。如果你想用纯Ruby做到这一点,以下是我提出的最简洁的方法(感谢@ ulysse-bn建议的改进)

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

答案 9 :(得分:0)

扩展字符串以添加驼峰

在纯Ruby中,您可以使用与Rails .camelize完全相同的代码来扩展字符串类

class String
  def camelize(uppercase_first_letter = true)
    string = self
    if uppercase_first_letter
      string = string.sub(/^[a-z\d]*/) { |match| match.capitalize }
    else
      string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { |match| match.downcase }
    end
    string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub("/", "::")
  end
end