名前を蛇のケースからラクダのケースに変換しようとしています。組み込みのメソッドはありますか?
例:"app_user"
から"AppUser"
(文字列"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"
ここのコメントにあります: Ruby文字列の分類
Wayne Conrad によるコメントを参照
classify
を使用します。 Edgeケースを適切に処理します。
"app_user".classify # => AppUser
"user_links".classify # => UserLink
注:
この回答は、質問で指定された説明に固有です(質問のタイトルに固有ではありません)。文字列をキャメルケースに変換しようとしている場合は、 Sergio の答えを使用する必要があります。質問者は、app_user
をApp_user
ではなくAppUser
に変換したいと述べているため、この回答があります。
ソース: 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"
純粋な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)
ラクダケースからスネークケースに移り、あなたの質問の逆を探してここに来ました。そのために nderscore を使用します(デカールしません):
AppUser.name.underscore # => "app_user"
または、既にラクダケース文字列がある場合:
"AppUser".underscore # => "app_user"
または、テーブル名を取得したい場合は、おそらくスネークケースが必要な理由です:
AppUser.name.tableize # => "app_users"
ここに答えを追加するのが少し不安です。 @ ulysse-bnのNiceベンチマークを無視して、最も読みやすく最小の純粋なRubyアプローチを採用することにしました。 :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"
ここにリストされている他のメソッドのほとんどは、Rails固有です。純粋なRubyでこれを実行したい場合は、私が思いついた最も簡潔な方法は次のとおりです(提案された改善のために@ ulysse-bnに感謝します)
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
純粋な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