ruby:在理解类和定义变量时遇到困难@

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 我可以理解它

我目前正在做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
我可以理解它要求我做什么:在类中创建一个类书和一个方法来进行资本化。然而,我对如何编写代码的想法是完全错误的(我已经看到了一个在这种情况下有效的代码示例)

我想做的是:

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
。好的,谢谢您的帮助。我了解我最初的一些问题,但现在我还有很多要研究和理解的。