回答:
これを試して:
puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')
#=> One Two Three Four
または
puts 'one TWO three foUR'.split.map(&:capitalize)*' '
.map(&:capitalize)
、ドキュメントのどこにそれを見つけたかを説明できますか?それについての言及はありません。また、*' '
2番目のコードスニペットの最後にあるとは何ですか?
&:method
に構文map
である配列内の各アイテムにメソッドを呼び出す簡潔の方法。次に、を呼び出しjoin
て、その配列を文字列に変換できます。* ' '
ある参加を呼び出すための別の方法。これは、配列内の項目を乗算して文字列を作成するものと考えることができます。
Railsの場合:
"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'
レールなし:
"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")
#OBJECT IT OUT
def titleize(str)
str.split(/ |\_/).map(&:capitalize).join(" ")
end
#OR MONKEY PATCH IT
class String
def titleize
self.split(/ |\_/).map(&:capitalize).join(" ")
end
end
Railsなし(#titleizeメソッドにパッチを当てるためにRailsのActiveSupportをロードしますString
)
require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"
Rails titleize
はダッシュやアンダースコアなどをスペースに変換し、特に@JamesMcMahonで指摘されている大文字と小文字を区別する状況で、他の予期しない結果を生成する可能性があります。
"hEy lOok".titleize #=> "H Ey Lo Ok"
これは、次のようなキャメルケースのコードを処理するためのものです。
"kirkDouglas".titleize #=> "Kirk Douglas"
このエッジケースに対処するには、#downcase
#titleizeを実行する前に、まず文字列をクリーンアップします。もちろん、これを行うと、キャメルケースの単語の区切りがすべて消去されます。
"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
別のオプションは、ブロックを取る正規表現とgsubを使用することです。
'one TWO three foUR'.gsub(/\w+/, &:capitalize)
.gsub(/\b\w/, &:capitalize)
「Jane mcCollins」のように、意図した大文字を単語内に保持します
String#capitalizeメソッドを調べます。
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize
"hello world".split.each{|i| i.capitalize!}.join(' ')
each
ブロックの各反復の戻り値は破棄されています。!
生成文字列の変更されたsplit
インプレースを。がない場合!
、capitalize
イテレーションごとに1つの新しい大文字の文字列が作成され、すぐに破棄されます。最終結果は"hello world"
、元の文字列とまったく同じになります。を使用する!
と、split
'd配列の各文字列が変更されるため、の結果each
は大文字の文字列の配列になります。
map
。しかし興味深いハック。ポイント
私はこれを同様の問題に使用しました:
'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }
これは、前の答えを試してみた次の奇妙なケースを処理します。
split
あなたはそれをさらに短くすることができますので、デフォルトではスペースに分割されます:'one TWO three foUR'.split.map(&:capitalize).join(' ')