我正在尝试将名称从蛇案转换为骆驼案。有没有内置的方法?
例如:"app_user"
到"AppUser"
(我有一个字符串"app_user"
我想将其转换为模型AppUser
)。
答案 0 :(得分:219)
如果你正在使用Rails,String#camelize就是你要找的。 p>
"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)
我采用了纯粹的红宝石代码来实现它的每一种可能性,在这里它们是:
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
# ...
有关更多示例和文档,请查看官方存储库:
答案 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