0

我在使用rspec. 在我的book.rb文件中,代码块通过了所有针对书籍标题中单词大写的测试(“杀死一只知更鸟”、“地狱”)。但是,当我从终端运行 rake 时,我反复收到错误消息

"Failure/Error: @book.title.should == "Inferno"
     ArgumentError:
       wrong number of arguments (0 for 1)". 

我尝试更改参数并删除标题方法,但没有任何效果,即使程序将标题大写,我仍然收到错误消息。谢谢,非常感谢任何帮助!

class Book
  attr_accessor :title, :littlewords

  def initialize
    @littlewords = ["the", "a", "an", "and", "of", "in"]
  end

  def title
    @title 
  end

  def title(lit)
    @title = ''
    books = lit.split
    books.each do |title|
      title.capitalize! unless (littlewords.to_s).include?(title)
    end

    books[0] = books[0].upcase
    books.first.capitalize!
    books.join(' ')
  end
end

s = Book.new
puts s.title("to kill a mockingbird")
puts s.title("inferno")
4

1 回答 1

0

在其他语言中,您可以拥有多个名称相同但接受不同参数的方法。在这些语言中,它们实际上是两种不同的方法。

红宝石不是那样的。

当你定义你的第二种方法时title,你实际上是在重写第一种方法title。因此,您可以使用一种方法来接受参数,而不是两种方法,一种方法接受参数,另一种方法不接受。

因此,当您调用 时@book.title.should,它正在调用需要参数的第二种方法。

首先,您不需要第一种方法title,因为您一开始就使用attr_accessor. 您可以免费获得该方法。

所以,当你使用:

attr_accessor :title

你得到:

def title
  @title
end

def title=(value)
  @title = value
end

所以,你想要做的是覆盖第二种方法。

attr_reader :title

def title=(lit)
  books = lit.split
  books.each do |title|
    title.capitalize! unless (littlewords.to_s).include?(title)
  end

  books[0] = books[0].upcase
  books.first.capitalize!
  @title = books.join(' ')
end

所以你可以这样设置标题:

s = Book.new
puts s.title = "to kill a mockingbird" #=> "To Kill a Mockingbird"
puts s.title = "inferno" #=> "Inferno"

这也将使您的测试@book.title.should按预期工作。

于 2013-09-30T13:28:10.527 回答