ruby:在理解类和定义变量时遇到困难@
我目前正在做rspec教程,阅读测试时遇到困难。我正在尝试阅读的当前测试是:ruby:在理解类和定义变量时遇到困难@,ruby,class,rspec,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 我可以理解它
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
我可以理解它要求我做什么:在类中创建一个类书和一个方法来进行资本化。然而,我对如何编写代码的想法是完全错误的(我已经看到了一个在这种情况下有效的代码示例)
我想做的是:
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测试中指定)
此外,我还在为代码中的“befordo”部分以及为什么它要求@book=book.new而苦苦挣扎
另外,带有&&的部分也令人困惑。为什么仅仅把@title=title.capitalize放进去是不好的
如果没有意义的话,我很乐意澄清这些(我知道这篇文章很长)。在Ruby中,@是一个基本的构造:一个类的实例变量。因此,不必在类的方法中将其作为参数传递。这个类的整个实例都知道它。例如,有关详细信息,请参见 因此,由于没有将实例变量作为方法参数传递,因此以下内容实际上无效:
def title(@book)
@book.capitalize
end
如果第一条语句为true或not,则&&
将只转到第二条语句nil
。比如说
def initialize(title=nil)
@title = title && title.capitalize!
end
将类的实例变量
@title
设置为参数title.capitalize代码>只要标题
不是零
。如果title
为nil
,则@title
将设置为title
(即nil
)。因此,如果类是在没有参数的情况下创建的,那么@title
将设置为nil
,并且使用大写方法调用nil
不会产生错误
我会在这里使用非感叹号版本的大写
。带感叹号的版本将修改传递的参数,这可能会导致奇怪的错误:title=“hello”;书=书。新(标题);title#=>“Hello”
还有一个建议:在你了解类、消息和实例变量之前,不要担心rspec。@hdgarood我目前正在通过rspec教程学习ruby。我已经指定了阅读材料,他们要我做的编码是测试第一教程。我的想法正确吗@title=title&&title.capitalize
表示:如果有标题,则大写;如果没有,则为title=nil
如果第一个标题不存在且未传递标题,是否会失败?还有为什么@title
而不是@book
(这有关系吗?@saidamudi,是的,如果title
是nil
,它会将@title
设置为title
。如果第一个标题
不在那里,而标题
为nil
,则会失败,因为您试图调用。大写在nil
对象上的code><代码>@book
或@title
只要类的用法是一致的就不重要了;我假设@title只是基于它所做的事情而更干净。rspec测试调用@book=book.new
有什么意义?这确实让我困惑。我以为它要求我创建一个名为@book
的实例变量,当调用该变量时,将为类book
@SaiDandamudi创建一个新对象。我看不到所有的测试,但它似乎在确保启动时,它有一个有效的,在@Book
中刷新Book
对象,而不是将其默认为nil
。好的,谢谢您的帮助。我了解我最初的一些问题,但现在我还有很多要研究和理解的。