Yanıtlar:
bunu dene:
puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')
#=> One Two Three Four
veya
puts 'one TWO three foUR'.split.map(&:capitalize)*' '
.map(&:capitalize)veya en azından işaret edebilir misiniz ? Buna bir referans bulamıyorum. Ayrıca, *' 'ikinci kod snippet'inin sonundaki anlaşma nedir?
&:methodsözdizimi mapa, dizideki her bir öğeye yöntemi çağırmak için kısa bir yol . Daha sonra joinbu diziyi bir dizeye dönüştürmek için arayabilirsiniz . Birleştirme * ' 'demenin alternatif bir yoludur . Bir dize oluşturmak için dizideki öğeleri birlikte çarpma olarak düşünebilirsiniz.
Raylarda:
"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'
Raysız:
"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
Raysız (#titleize yöntemini yamalamak için rayların ActiveSupport'u yükleyin String)
require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"
Rails titleize, tire ve alt çizgi gibi şeyleri boşluklara dönüştürecek ve özellikle @JamesMcMahon'un işaret ettiği gibi büyük / küçük harfe duyarlı durumlarla beklenmedik sonuçlar doğurabilir:
"hEy lOok".titleize #=> "H Ey Lo Ok"
çünkü deve kasalı kodun kullanılması gerekiyordu:
"kirkDouglas".titleize #=> "Kirk Douglas"
Bu son durumla başa çıkmak için #downcase#titleize çalıştırmadan önce dizenizi temizleyebilirsiniz. Elbette bunu yaparsanız, deveKasalı kelime ayrımlarını silersiniz:
"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
"hello world".titleize hangi "Merhaba Dünya" çıktı gerekir.
"One Two Three Fo Ur"çıkış, bu durumda istenen çıkıştan farklıdır, ancak diğerlerinde istenebilir.
Başka bir seçenek, bir blok alan bir normal ifade ve gsub kullanmaktır:
'one TWO three foUR'.gsub(/\w+/, &:capitalize)
.gsub(/\b\w/, &:capitalize)kelimeler içinde amaçlanan büyük harf kullanımını korur, örneğin "Jane mcCollins"
String # capitalize yöntemine bakın.
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize
"hello world".split.each{|i| i.capitalize!}.join(' ')
eachBloğun her yinelemesinin dönüş değeri atılır. !Tarafından üretilen dizeleri değiştiriyorsa splityerinde. Olmadan !, capitalizeatılmadan hemen sonra yineleme başına bir yeni harfle dize oluşturma ve olacaktır. Nihai sonuç "hello world", orijinal dize ile aynı olacaktır . İle !, her bir dize splitd' dizisi değiştiriliyor ve bu nedenle sonuç, eachaktifleştirilen şeritlerinin bir dizidir.
map. İlginç olsa kesmek. Puanlar
Bunu benzer bir sorun için kullandım:
'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }
Bu, önceki cevapları denerken gördüğüm aşağıdaki garip durumları ele alıyor:
splitvarsayılan olarak uzaya bölünecek, böylece daha da kısa hale getirebilirsiniz:'one TWO three foUR'.split.map(&:capitalize).join(' ')