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

我目前正在做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 = "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()返回。++