1

我目前正在做一个 rspec 教程并且在阅读测试时遇到了困难。我正在尝试阅读的当前测试是:

 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

我可以理解它要求我做什么:创建一个类 Book 和一个在该类中大写的方法。但是我对如何编写代码的想法是完全错误的(我已经看到了在这种情况下有效的代码示例)

我试图做的事情:

class Book
    def initialize(book)
        @book = book
    end

    def title(@book)
        @book.capitalize
    end
end

最终工作的解决方案:

class Book

    attr_reader :title

    def initialize(title=nil)
      @title = title && title.capitalize!
    end

    def title=(new_title)
        @title = new_title && new_title.capitalize!
    end
end

我不明白 @ 到底是做什么的。我认为这是创建一个适用于整个班级的变量。另外,我想知道为什么使用@title 而不是@book(在rspec 测试中指定)。

此外,我正在努力解决代码的“之前”部分以及为什么它要求 @book = Book.new

&& 的部分也令人困惑。为什么只放@title = title.capitalize 不行!

如果没有任何意义,我很乐意澄清其中的任何内容(我知道这篇文章很长)。

4

1 回答 1

2

@ 是 Ruby 中的一个基本结构:一个类的实例变量。所以你不必在类的方法中将它作为参数传递。类的整个实例都知道它。有关详细信息,请参见实例变量和访问器。

因此,以下内容并不真正有效,因为您没有将实例变量作为方法参数传递:

def title(@book)
    @book.capitalize
end

如果第&&一个语句为真或不正确,则只会转到第二个语句nil。例如

def initialize(title=nil)
  @title = title && title.capitalize!
end

只要不是,就会将类的实例变量@title设置为参数。如果是,那么将被设置为(即)。因此,如果类是在没有参数的情况下创建的,则将设置为,并且使用方法调用不会产生错误。title.capitalize!titleniltitlenil@titletitlenil@titlenilnilcapitalize!

于 2013-09-03T23:24:01.093 回答