/ / Konwertuj ciąg znaków na wielkość liter [zamknięte] - ruby, rspec

Konwertuj ciąg znaków na tytułową nazwę [closed] - ruby, rspec

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 № 1

Posł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 eachi przed końcem definicji metody.