ruby:无法理解类并使用@定义变量

时间:2013-09-03 23:10:08

标签: ruby class rspec

我目前正在做一个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测试中指定)。

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

还有&&&也令人困惑。为什么只放@title = title.capitalize就好了?

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

1 个答案:

答案 0 :(得分:2)

@是Ruby中的基本构造:类的实例变量。因此,您不必将其作为类的方法中的参数传递。它已被整个类的实例所知。有关详细信息,请参阅Instance Variables and Accessors

因此,由于您未将实例变量作为方法参数传递,因此以下内容无效:

def title(@book)
    @book.capitalize
end

如果第一个是真的&&nil将仅转到第二个陈述。例如

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

只要@title不是title.capitalize!,就会将类'实例变量title设置为参数nil。如果titlenil,则@title将设置为title(即nil)。因此,如果创建的类没有参数,则@title将设置为nil,并且使用方法nil调用capitalize!时不会生成错误。< / p>