我目前正在做一个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就好了?
如果没有意义,我很乐意澄清其中的任何内容(我知道这篇文章很长)。
答案 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
。如果title
为nil
,则@title
将设置为title
(即nil
)。因此,如果创建的类没有参数,则@title
将设置为nil
,并且使用方法nil
调用capitalize!
时不会生成错误。< / p>