图书资本化类错误

时间:2017-05-31 16:49:04

标签: ruby string class rspec

我自学了如何编码,似乎无法理解这门课程如何调用输入的标题。论证在哪里首先? attr_accessor或def标题capital_it(@title)结束了吗?

class Book

    attr_accessor :title

    def title
        capital_it(@title)
    end

    def capital_it(title)
        word_arr = @title.capitalize.split(" ")
        word_arr.map do |word|
            word.capitalize! unless little_words.include?(word)
            end
        word_arr.join(" ")
    end

    def little_words
        ["the", "a", "an", "and", "in", "of"]
    end

end

2 个答案:

答案 0 :(得分:2)

  

争论到底在哪里? attr_accessordef title ...?

attr_accessor :title为您定义了两种方法:title(“读者”)和title=(“作者”)。在def title之后attr_accessor进行title时,您将使用新方法完全替换attr_accessor方法。

换句话说,attr_writer生成的方法永远不会被调用,因为你已经用自己的方法覆盖了它。

由于您正在编写自己的“阅读器”方法,因此您应该使用class Book attr_writer :title def title capital_it(@title) end # ... end

cd /some/path; source ./setup.bash

答案 1 :(得分:1)

首先,您的def capital_it(title)方法存在问题。

  1. .map方法将返回一个您未分配给任何内容的新数组。如果您想将其重新分配给本地变量word_arr,请使用.map!
  2. 您可能应该将条件word.capitalize! unless little_words.include?(word)重写为此little_words.include?(word) ? word : word.capitalize
  3. P.S。在你的情况下它是有效的,因为你在每个元素字符串上使用capitalize!,但这样的写作风格并不好。

    所以我建议你像这样编写你的课程:

    class Book
      SKIP = %w(the a an and in of)
    
      attr_writer :title
    
      def initialize(title)
        @title = title
      end
    
      def title
        capital(@title)
      end
    
      private
    
      def capital(title)
        array = @title.split(/\s+/)
        array.map! do |word|
          SKIP.include?(word) ? word: word.capitalize
        end
        array.join(" ")
      end
    end