Odpowiedzi:
Spróbuj tego:
puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')
#=> One Two Three Four
lub
puts 'one TWO three foUR'.split.map(&:capitalize)*' '
.map(&:capitalize)lub przynajmniej wskazać, gdzie w dokumencie go znalazłeś? Nie mogę znaleźć żadnego odniesienia do tego. O co chodzi z tym *' 'na końcu drugiego fragmentu kodu?
&:methodskładnia w mapjest zwięzłym sposobem wywołania metody dla każdego elementu tablicy . Następnie możesz wywołać, joinaby przekształcić tę tablicę w ciąg. * ' 'Jest alternatywnym sposobem zadzwonić przyłączyć . Można o tym myśleć jako o pomnożeniu elementów tablicy w celu utworzenia ciągu.
W szynach:
"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'
bez szyn:
"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 (załaduj ActiveSupport railsów do poprawki metody #titleize String)
require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"
Railsy titleizezamieniają takie rzeczy jak myślniki i podkreślenia na spacje i mogą dawać inne nieoczekiwane rezultaty, szczególnie w sytuacjach z rozróżnianiem wielkości liter, jak wskazał @JamesMcMahon:
"hEy lOok".titleize #=> "H Ey Lo Ok"
ponieważ jest przeznaczony do obsługi kodu w postaci wielbłąda, takiego jak:
"kirkDouglas".titleize #=> "Kirk Douglas"
Aby poradzić sobie z tym #downcaseskrajnym przypadkiem, możesz najpierw wyczyścić ciąg przed uruchomieniem #titleize. Oczywiście, jeśli to zrobisz, usuniesz wszelkie separacje słów wielbłąda:
"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
"hello world".titleize co powinno wyświetlić „Hello World”.
"One Two Three Fo Ur"które jest inne niż pożądane wyjście w tym przypadku, ale może być pożądane w innych.
Inną opcją jest użycie wyrażenia regularnego i gsub, które przyjmują blok:
'one TWO three foUR'.gsub(/\w+/, &:capitalize)
.gsub(/\b\w/, &:capitalize)zachowuje zamierzone wielkie litery w słowach, np. „Jane mcCollins”
Przyjrzyj się metodzie String # capitalize.
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize
"hello world".split.each{|i| i.capitalize!}.join(' ')
eachbloku jest odrzucana. !Modyfikuje struny produkowane przez splitin-place. Bez !, capitalizebyłoby utworzenie jednego nowego skapitalizowanych za ciąg iteracji, a następnie natychmiast odrzucając go. Ostateczny wynik byłby "hello world"taki sam, jak oryginalny ciąg. W przypadku !, każdy ciąg w splittablicy 'd jest zmieniany, a zatem wynikiem eachjest tablica ciągów pisanych wielkimi literami.
map. Ciekawy hack. Punkty
Użyłem tego do podobnego problemu:
'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }
To rozwiązuje następujące dziwne przypadki, które widziałem, próbując poprzednich odpowiedzi:
splitdomyślnie podzieli się na przestrzeń, więc możesz ją skrócić:'one TWO three foUR'.split.map(&:capitalize).join(' ')