【问题标题】:Book Capitalization Class Error书籍大写类错误
【发布时间】:2017-11-01 14:19:43
【问题描述】:

我正在自学如何编码,但似乎无法理解此类如何调用输入的标题。争论首先在哪里? 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

【问题讨论】:

  • 错误信息可以指导您。在您的 capital_it 方法中,您的 map do 缺少 end
  • 根据您的initialize 方法,当您使用Book.new 创建一本新书时,您必须传递一个参数,即@book = Book.new('a title')
  • 我似乎不明白参数是如何通过类传递的,以及每个方法根据实例变量的设置方式提供什么功能。我得到了规范,但我必须在没有参数的情况下执行“def initializer”,并在正文中通过如下方法传递实例变量:capital_it(@title)。
  • 可能值得学习某种教程,有很多概念需要理解。这个链接ruby-for-beginners.rubymonstas.org/writing_classes/…可能有助于同时理解initialize
  • 非常感谢您的帮助 sagarpandya82!它终于通过了检查,我现在看到我不明白 attr_accessors 和初始化方法是如何工作的和/或参数是如何输入到代码中的

标签: ruby string class rspec


【解决方案1】:

论点首先在哪里? attr_accessordef title ... ?

attr_accessor :title 为您定义了两种方法:title(“读取器”)和title=(“写入器”)。当您在 attr_accessor 之后执行 def title 时,您将完全用您的新方法替换 title 方法。

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

由于您正在编写自己的“阅读器”方法,因此您应该只使用attr_writer

class Book
  attr_writer :title

  def title
    capital_it(@title)
  end

  # ...
end

【讨论】:

    【解决方案2】:

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

    1. .map 方法将返回一个您没有分配给任何东西的新数组。如果您想将其重新分配给局部变量 word_arr,请改用 .map!
    2. 您可能应该将条件word.capitalize! unless little_words.include?(word) 重写为little_words.include?(word) ? word : word.capitalize

    附:在您的情况下,它可以工作,因为您在每个元素字符串上使用 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
    

    【讨论】:

    • “私有”的意义何在?我在许多解决方案中都看到过它,但我找不到使用它的原因。我认为它是为了向您的网站或程序的用户隐藏代码
    • @stringathing 关于encapsulation
    猜你喜欢
    • 2017-04-17
    • 2021-04-30
    • 2011-02-03
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多