Jawaban:
coba ini:
puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')
#=> One Two Three Four
atau
puts 'one TWO three foUR'.split.map(&:capitalize)*' '
.map(&:capitalize)
atau setidaknya menunjuk ke tempat di mana Anda menemukannya? Saya tidak dapat menemukan referensi untuk itu. Juga, apa masalahnya dengan *' '
di akhir cuplikan kode kedua?
&:method
sintaks dalam map
adalah cara ringkas untuk memanggil metode pada setiap item dalam array . Anda kemudian dapat memanggil join
untuk mengubah array itu menjadi string. Ini * ' '
adalah cara alternatif untuk memanggil gabung . Anda bisa menganggapnya sebagai mengalikan item dalam array bersama-sama untuk membuat string.
Dalam Rails:
"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'
tanpa rel:
"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
w / o Rails (memuat ActiveSupport rel untuk mem-patch metode #titleize ke String
)
require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"
Rails titleize
akan mengubah hal-hal seperti tanda hubung dan garis bawah menjadi spasi dan dapat menghasilkan hasil tak terduga lainnya, terutama dengan situasi case-sensitive seperti yang ditunjukkan oleh @JamesMcMahon:
"hEy lOok".titleize #=> "H Ey Lo Ok"
karena ini dimaksudkan untuk menangani kode cased camel seperti:
"kirkDouglas".titleize #=> "Kirk Douglas"
Untuk menangani casing tepi ini, Anda dapat membersihkan string Anda #downcase
terlebih dahulu sebelum menjalankan #titleize. Tentu saja jika Anda melakukannya, Anda akan menghapus setiap pemisahan kata camelCased:
"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
"hello world".titleize
yang seharusnya menampilkan "Hello World".
"One Two Three Fo Ur"
yang berbeda dari output yang diinginkan dalam hal ini, tetapi mungkin diinginkan pada yang lain.
Pilihan lain adalah menggunakan regex dan gsub, yang membutuhkan blok:
'one TWO three foUR'.gsub(/\w+/, &:capitalize)
.gsub(/\b\w/, &:capitalize)
mempertahankan kapitalisasi yang dimaksudkan dalam kata-kata, misalnya "Jane mcCollins"
Lihatlah metode 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
blok sedang dibuang. The !
memodifikasi string yang diproduksi oleh split
in-place. Tanpa itu !
, capitalize
akan membuat satu string kapital baru per iterasi, dan kemudian segera membuangnya. Hasil akhirnya akan "hello world"
, sama seperti string asli. Dengan !
, setiap string dalam split
array sedang diubah, dan oleh karena itu hasilnya each
adalah array dari string kapital.
map
. Retas yang menarik. Poin
Saya menggunakan ini untuk masalah yang sama:
'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }
Ini menangani kasus aneh berikut yang saya lihat mencoba jawaban sebelumnya:
split
akan terpecah pada ruang secara default, sehingga Anda dapat membuatnya lebih pendek:'one TWO three foUR'.split.map(&:capitalize).join(' ')