0

私は、すべての単語の最初の文字を大文字にする方法を構築しようとしていました。私はそれを書いた

def titleize(name)
   name.scan(/\w+/) { |x| x.capitalize! }
end

そして、それは正しく機能しません。それは大文字と文字ではありません。いくつかの検索を行ったところ、最終的にタイトルを大文字にする答えが見つかりました。と書かれていました

def titleize(name)
   name.split(" ").each { |x| x.capitalize! }.join(" ")
end

私のコードがまったく大文字にならなかったのはなぜですか? put ステートメントを追加して次のように記述した場合

def titleize(name)
   name.scan(/\w+/) { |x| puts x.capitalize! }
end

大文字で「こんにちは」と出力されますが、=> は「こんにちは」のままです。

4

4 に答える 4

1

#scan正規表現の結果である新しいオブジェクトを返しString、それらをブロックに渡すため、コードは機能しません。したがって、メソッドでは、本質的にこれらの新しいオブジェクトを取得し、呼び出してそれらを変更しました#capitalize!が、その後は決して使用しませんでした。

代わりに次のことを行う必要があります。

def titleize(name)
  name.scan(/\w+/).each { |x| x.capitalize! }.join(' ')
end

しかし、これは私にとってより読みやすいようです:

def titleize2(name)
  name.split(' ').each { |w| w.capitalize! }.join(' ')
end

ただし、これらのメソッドは渡された元の引数を変更しないことに注意してください。

于 2013-04-17T17:36:51.400 に答える
0

のブロック形式はscan、ブロック内で何を行っても、元の文字列を返します。(ブロック内の元の文字列を直接参照することで変更できると思いますが、繰り返しているものを変更することはお勧めしません。)代わりに、バリエーションsplitを実行しますが、 の代わりに を実行します。eachcollectjoin

name.split(" ").collect { |x| x.capitalize }.join(" ")

これは、数字や句読点を含むタイトルにも有効です。

于 2013-04-17T17:54:27.990 に答える