Czuję, że jestem naprawdę blisko, ale nie mogę zrozumieć, dlaczego .join
nie działa.
Oto kod, który napisałem:
class String
def title_case
title = self.split
title.each do |word|
unless (word.include?("of")) || (word.include?("the")) && (title.first != "the")
word.capitalize!
end
title.join(" ")
end
end
end
A to jest RSPEC:
describe "String" do
describe "Title case" do
it "capitalizes the first letter of each word" do
"the great gatsby".title_case.should eq("The Great Gatsby")
end
it "works for words with mixed cases" do
"liTTle reD Riding hOOD".title_case.should eq("Little Red Riding Hood")
end
it "ignores articles" do
"The lord of the rings".title_case.should eq("The Lord of the Rings")
end
end
end
Odpowiedzi:
2 dla odpowiedzi № 1Posługiwać się .map
zamiast .each
:
class String
def title_case
title = self.split
title.map do |word|
unless (word.include?("of")) || (word.include?("the")) && (title.first != "the")
word.capitalize
end
end.join(" ")
end
end
2 dla odpowiedzi nr 2
Jeśli poprawnie sformatowałeś kod, zobaczysz, że zgubiłeś plik #join
połączenie. Musi być na zewnątrz each
pętla.
def title_case
title = self.split
title.each do |word|
unless (word.include?("of")) || (word.include?("the")) && (title.first != "the")
word.capitalize!
end
end
title.join(" ")
end
Ale za pomocą map
i nieniszczące capitalize
(jak w odpowiedzi @xdazz) byłoby bardziej idiomatyczne.
1 dla odpowiedzi nr 3
Trochę (subtelne) ponowne wcięcie pokazuje twój problem:
class String
def title_case
title = self.split
title.each do |word|
unless (word.include?("of")) || (word.include?("the")) && (title.first != "the")
word.capitalize!
end
title.join(" ")
end # End of each
end # End of def
end
Zwracasz wartość wywołania do each
. Poprawka polega na przeniesieniu się title.join(" ")
jeden wiersz w dół, po zakończeniu each
i przed końcem definicji metody.