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?
&:methodsintaks dalam mapadalah cara ringkas untuk memanggil metode pada setiap item dalam array . Anda kemudian dapat memanggil joinuntuk 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 titleizeakan 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 #downcaseterlebih 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(' ')
eachblok sedang dibuang. The !memodifikasi string yang diproduksi oleh splitin-place. Tanpa itu !, capitalizeakan membuat satu string kapital baru per iterasi, dan kemudian segera membuangnya. Hasil akhirnya akan "hello world", sama seperti string asli. Dengan !, setiap string dalam splitarray sedang diubah, dan oleh karena itu hasilnya eachadalah 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:
splitakan terpecah pada ruang secara default, sehingga Anda dapat membuatnya lebih pendek:'one TWO three foUR'.split.map(&:capitalize).join(' ')