2013-09-10 1 views
0

В настоящее время я занимаюсь учебным курсом rspec ruby. Одна из проблем требует от меня написать программу book_title, которая использует некоторые правила капитализации на английском языке. Тесты очень долго, но, чтобы дать вам несколько идей о том, что он просит я включил первые последние испытания ниже: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_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 еще раз, когда я пытаюсь @ тайтл присоединиться и @title #capitalize).

Некоторые другие мысли: Я думал только о настройке первой части (самая длинная строка, заканчивающаяся на word.capitalize! end end, на другую переменную (возможно, book_title или new_title), но мне было интересно, какая причина для инициализации или использования @title в первую очередь.

Любой вход, а также редактирует для чистого кода, был бы весьма признателен

+0

Код ломается, или ваши тесты терпят неудачу? –

+0

тесты терпят неудачу после теста inferno –

+0

Я не уверен, когда вы говорите «перерывы кода». если вы хотите, чтобы первая буква заглаждалась, сохраняя остальные заглавные символы, вам просто нужно выставить первый символ с помощью регулярного выражения. см. [Ruby capize first character with spaces] (http://stackoverflow.com/questions/14471511/ruby-capitalize-first-character-with-spaces). Лично я также хотел бы предложить, чтобы с помощью getter можно было настроить строку вместо setter. – shawnzhu

ответ

2

вопроса вы испытываете во втором примере, что Array#each возвращает пЕРЕЧИСЛИМОЕ, ​​на котором .each называли, поэтому в этом случае вы получаете результат от book_title.split(" ") (хотя и модифицированный блоком). e присваивая этот результат переменной экземпляра @title. Вызов join в массиве возвращает строку, но вы ничего не делаете с этой строкой, кроме выделения ее. Если вы хотите присвоить его переменной title, вам нужно сделать @title = @title.join(" "). То же самое с capitalize.

+0

Это действительно разъясняет тонну для меня, спасибо. Последний вопрос, который у меня был, был с последним тестом. Последний тест просят меня загладить первую работу. Я попытался использовать '@title = @ title.capitalize' как последнее утверждение, но ничего не делает. Он по-прежнему говорит, что тест завершился неудачно –

+0

Небольшая точка: _Array # каждый возвращает перечислимое значение, на которое .each было вызвано_ ... не когда блок был поставлен (изменился ли пример с примером?). И когда блок не предоставляется, каждый() возвращает Enumerator, который явно не совпадает с перечислимым, на который вызывается каждый(). Попробуйте это: 'arr = [1, 2, 3] puts arr.object_id x = [1, 2, 3] .each помещает x.object_id'. Enumerable - это модуль, который включает классы для содержащихся в нем методов. Перечислитель - это класс, экземпляр которого возвращается каждым(), когда не предоставляется блок. ++ anyway – 7stud

+0

@ 7stud - Справедливая точка. –

Смежные вопросы