回答:
Railsを使用している場合、探しているのはString#camelizeです。
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
実際のクラスを取得したい場合は、その上でString#constantizeを使用する必要があります。
"app_user".camelize.constantize
ruby-on-rails
ので、問題ないと思います。しかし言及してくれてありがとう。
#classify
代わりに使用してください。"some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"
は、Railsがすでにインストールされていれば十分です。
これはどう?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
ここのコメントにあります: Ruby文字列の分類
ウェイン・コンラッドのコメントを見る
Railsを使用する場合は、を使用しclassify
ます。エッジケースをうまく処理します。
"app_user".classify # => AppUser
"user_links".classify # => UserLink
注意:
この回答は、質問で指定された説明に固有です(質問のタイトルに固有ではありません)。文字列をキャメルケースに変換しようとしている場合は、セルジオの答えを使用する必要があります。質問者は彼が(ではない)に変換app_user
したいと述べているため、この答えは..AppUser
App_user
classify
文字列を返すことに注意してくださいconstantize
。実際のクラスに変換するには、後で呼び出す必要があります。
classify
は、複数形の文字列が単数になることです...に'age_in_years'.classify
なるAgeInYear
4.2.11
ソース: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"
self.split('_').inject([]){ |buffer,e| buffer + [buffer.empty? ? e : e.capitalize] }.join
私は純粋なルビコードでそれを行うために考えていたすべての可能性を取りました、ここにあります:
大文字とgsub
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}
&
短縮形を使用して分割およびマッピング(user3869936の回答に感謝)
'app_user'.split('_').map(&:capitalize).join
分割してマッピング(Black氏の回答に感謝)
'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)
キャメルケースからスネークケースまで、あなたの質問の逆を探してここに来ました。そのためにアンダースコアを使用します(デカメル化しないでください):
AppUser.name.underscore # => "app_user"
または、すでにキャメルケースの文字列がある場合:
"AppUser".underscore # => "app_user"
または、テーブル名を取得する場合は、おそらく蛇のケースが必要なのはこのためです。
AppUser.name.tableize # => "app_users"
AppUser.table_name
ですか?また、app_usersではなく、他の場所で定義されているものである場合は、真のテーブル名を使用することもできます。
ここに答えを追加するのが少し不安です。@ 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"
PascalCase
はのサブセットですCamelCase
。また、これは私が知っていることです-そのキャメルケースは両方に適用されました。しかし、私は調査したことがありません。PascalCaseについて言及していただきありがとうございます。en.wikipedia.org/wiki/Camel_case
:method
バージョンがdowncase
最初に実行され、lower_snake_case
との両方で使用できるようにすると便利ですUPPER_SNAKE_CASE
。
ここにリストされている他のメソッドのほとんどはRails固有です。純粋なRubyでこれを行う場合は、以下が私が思いついた最も簡潔な方法です(提案された改善のために@ ulysse-bnに感謝します)。
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsub
ソリューションに戻ってきました、それはソリューションと比較して遅いようmap
です。
純粋な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