0

我目前正在做一个 rspec ruby​​ 教程。其中一个问题需要我编写一个 book_title 程序,该程序利用英语中的一些大写规则。测试非常长,但为了让您了解它的要求,我在下面包含了第一个最后的测试:

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_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_title 或 new_title),但我想知道初始化或使用 @title 的原因是什么。

任何输入,以及更简洁的代码编辑,将不胜感激

4

1 回答 1

2

您在第二个示例中遇到的问题是Array#each返回被调用的可枚举.each,因此在这种情况下,您将从book_title.split(" ")(尽管被块修改)得到结果。您正在将此结果分配给@title实例变量。调用join一个数组会返回一个字符串,但是除了分配它之外,你没有对该字符串做任何事情。如果您想将其分配给 title 变量,您需要执行@title = @title.join(" "). 与 相同capitalize

于 2013-09-10T00:45:05.820 回答