我需要将书名中的每个单词大写为我的代码。我无法遍历数组的每个元素,并将第一个字母大写。我真的看不出我做错了什么。任何帮助将不胜感激。
class Title
attr_accessor :string
def initialize(string)
@string = string
end
def fix
@string.downcase!
new_array = []
if @string.include?(" ")
new_array << @string.split(" ")
new_array.map {|word| word.capitalize}
new_array.join(" ")
else
@string.capitalize!
end
end
end
规格:
describe "Title" do
describe "fix" do
it "capitalizes the first letter of each word" do
expect( Title.new("the great gatsby").fix ).to eq("The Great Gatsby")
end
it "works for words with mixed cases" do
expect( Title.new("liTTle reD Riding hOOD").fix ).to eq("Little Red Riding Hood")
end
it "downcases articles" do
expect( Title.new("The lord of the rings").fix ).to eq("The Lord of the Rings")
expect( Title.new("The sword And The stone").fix ).to eq("The Sword and the Stone")
expect( Title.new("the portrait of a lady").fix ).to eq("The Portrait of a Lady")
end
it "works for strings with all uppercase characters" do
expect( Title.new("THE SWORD AND THE STONE").fix ).to eq("The Sword and the Stone")
end
end
end
答案 0 :(得分:1)
你应该摆脱
new_array = []
您不需要为split
初始化数组。您正在数组中创建一个数组。
答案 1 :(得分:0)
您的修复功能应该是:
def fix
new_array = @string.split(" ")
new_array.map {|word| word.capitalize}.join(" ")
end
开头没有必要使用downcase,因为大写字符串会对字符串进行大写,然后将第一个字母大写。
此代码也不关心字符串是否只有一个或多个单词,因此if是不必要的。
最后你正在初始化一个数组,然后使用&lt;&lt;插入另一个数组,你应该只分配从分裂中收到的数据,因为它已经是一个数组。