Ruby:类中的方法拒绝在多行上修改
我目前正在做rspec ruby教程。其中一个问题要求我编写一个书名程序,利用英语中的一些大写规则。测试非常长,但为了让您了解它的要求,我在下面列出了最后的测试:Ruby:类中的方法拒绝在多行上修改,ruby,rspec,class-method,Ruby,Rspec,Class Method,我目前正在做rspec ruby教程。其中一个问题要求我编写一个书名程序,利用英语中的一些大写规则。测试非常长,但为了让您了解它的要求,我在下面列出了最后的测试: require 'book' describe Book do before do @book = Book.new end describe 'title' do it 'should capitalize the first letter' do @book.title = "infe
require 'book'
describe Book do
before do
@book = Book.new
end
describe 'title' do
it 'should capitalize the first letter' do
@book.title = "inferno"
@book.title.should == "Inferno"
end
specify 'the first word' do
@book.title = "the man in the iron mask"
@book.title.should == "The Man in the Iron Mask"
end
end
end
end
我的代码是:
class Book
attr_accessor :title
def initialize(title = nil)
@title = title
end
def title=(book_title = nil)
stop_words = ["and", "in", "the", "of", "a", "an"]
@title = book_title.split(" ").each{ |word|
unless stop_words.include?(word)
word.capitalize!
end}.join(" ").capitalize
end
end
我遇到的这个问题与def title=
方法有关@title=book\u title.split
(…等)都在一行中,因为当我尝试拆分它时,我以前的许多测试都失败了
我尝试过的一些代码示例:
@title = book_title.split(" ").each do |word| # attempting to add words to an array
unless stop_words.include?(word) # to capitalize each word
word.capitalize!
end
end
@title.join(" ") # Joining words into one string
@title.capitalize # Capitalizing title's first word
end # to follow the last test
当我尝试这样做时,测试失败了(我想这与我尝试@title#join和@title#capitalize时再次调用@title有关)
其他一些想法:我在考虑将第一部分(以word.capitalize!end-end
结尾的最长行)设置为另一个变量(可能是book\u title或new\u title),但我想知道,即使是初始化或使用@title,最初的原因是什么
任何输入,以及对更干净代码的编辑,都将不胜感激在第二个示例中,您遇到的问题是,
数组#每个
返回调用的可枚举项。每个
,因此在本例中,您将从book_title.split(“”
(尽管通过块进行了修改)。您正在将此结果分配给@title
实例变量。对数组调用join
将返回一个字符串,但除了分配字符串外,您没有对该字符串执行任何操作。如果要将其分配给title变量,则需要执行@title=@title.join(“”)操作
。与大写相同
代码中断,或者您的测试失败?在地狱般的测试后测试失败我不确定您何时说“代码中断”。如果您希望通过保留其余大写字符来将第一个字母大写,则只需通过regexp将第一个字符的大小写升级。请参阅。我个人还建议使用getter来进行字符串调整,而不是setter。@shawnzhu很抱歉,我编辑了我的文章。我不是说代码会中断(正如在对Zach Kemp的评论中阐明的那样)。我的意思是说其他很多测试都失败了(扎克在回答中解释了原因)。至于大写第一个字母,你链接的页面非常有用(谢谢),但这个问题也涉及一些不应该大写的单词。例如,“战争与和平”应该变成“战争与和平”这对我来说真的很清楚,谢谢。最后一个问题是关于最后一个测试。最后一个测试要求我将第一个工作大写。我尝试使用@title=@title.capitalize
作为最后一个语句,但它什么也没做。它仍然说测试失败一个小点:数组#每个返回一个枚举,每个被调用…不是在提供块时调用的(op是否更改了示例?)。当未提供块时,each()返回一个枚举数,这显然与调用each()的枚举数不同。请尝试以下操作:arr=[1,2,3]put arr.object_id x=[1,2,3].each puts x.object_id
。Enumerable是类为其中包含的方法包含的一个模块。Enumerator是一个类,当没有提供块时,其实例由each()返回。++