web-dev-qa-db-ja.com

Rubyの文字列をsnake_caseからCamelCaseに変換します

名前を蛇のケースからラクダのケースに変換しようとしています。組み込みのメソッドはありますか?

例:"app_user"から"AppUser"

(文字列"app_user"があります。これをモデルAppUserに変換します)。

157
Lohith MV

Railsを使用している場合、 String#camelize が探しています。

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

実際のクラスを取得したい場合は、その上で String#constantize を使用する必要があります。

"app_user".camelize.constantize
228

これはどう?

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

ここのコメントにあります: Ruby文字列の分類

Wayne Conrad によるコメントを参照

109
user3869936

classifyを使用します。 Edgeケースを適切に処理します。

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

注:

この回答は、質問で指定された説明に固有です(質問のタイトルに固有ではありません)。文字列をキャメルケースに変換しようとしている場合は、 Sergio の答えを使用する必要があります。質問者は、app_userApp_userではなくAppUserに変換したいと述べているため、この回答があります。

40
Harish Shetty

ソース: 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"
23
Mr. Black

純粋なRubyソリューションのベンチマーク

純粋な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)
15
Ulysse BN

ラクダケースからスネークケースに移り、あなたの質問の逆を探してここに来ました。そのために nderscore を使用します(デカールしません):

AppUser.name.underscore # => "app_user"

または、既にラクダケース文字列がある場合:

"AppUser".underscore # => "app_user"

または、テーブル名を取得したい場合は、おそらくスネークケースが必要な理由です:

AppUser.name.tableize # => "app_users"

9
mike

ここに答えを追加するのが少し不安です。 @ 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"
2
akostadinov

ここにリストされている他のメソッドのほとんどは、Rails固有です。純粋なRubyでこれを実行したい場合は、私が思いついた最も簡潔な方法は次のとおりです(提案された改善のために@ ulysse-bnに感謝します)

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

文字列を拡張してキャメル化を追加

純粋な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