1

目前正在通过 rspec 教程苦苦挣扎,非常感谢您的澄清。

代码是:

class Book

    attr_reader :title

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

    def title=(new_title = nil)
        @title = new_title && new_title.each do |word|
        word.capitalize!
    end
end

两个问题:

  1. 为什么有两组@title(即:为什么它在两者中都被定义initializetitle被设置=不同的东西)?

  2. 为什么该title方法=后面有一个?如果我不使用=.

编辑:出于我的 rspec 教程的目的,这是我最终尝试的有效代码

class Book
    attr_accessor :title

    def initialize(title = nil)
        @title = title
    end

    def title=(book_title = nil)
        @title = book_title.capitalize 
    end
end 

我最初的问题是 title= 方法。最后,我遇到了一个解释什么是 method= function 的线程。如果您想为类方法中的某些内容分配值,这是必要的(至少这是我目前的理解。请随时纠正我)。

我也将不胜感激此新代码中的任何提示。

4

2 回答 2

1

让我们分析一下:

attr_reader :title

这里我们基本上是定义方法:

def title; @title; end

它返回实例变量@title

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

在这里,我们定义了一个 0-1 参数构造函数,它可以简化为:

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

事实上,title在构造函数中是参数变量而不是titleortitle=方法,因此title=后面定义的方法永远不会在这里调用。请注意,此处&&用于短路评估

def title=(new_title = nil)
    @title = new_title && new_title.each do |word|
    word.capitalize!
end

这里我们实际上有两个语法错误:第一个是 for Strings (我假设它是稍后调用的标题String#capitalize!的类型)没有each方法。写这篇文章的人可能意味着String#each_charString#split首先代替它。

第二个错误是 之后的块each没有用end.

现在假设这个版本:

def title=(new_title = nil)
    @title = new_title && new_title.split(' ').each { |word| word.capitalize! }.join(' ')
end

将出于与以前相同的原因(短路评估)title=分配title给变量,并且可以简化为:@title

def title=(new_title = nil)
    new_title && @title = new_title
end
于 2013-09-04T00:58:37.247 回答
0

initialize在构造类的实例时调用该方法。那里设置的@title = ...初始值@title

title=当有人随后在类的实例上设置 title 的值时,将调用该方法。然后它会相应地调整 的值@title。有关详细说明,请参阅Ruby访问器。

举个例子:

book = Book.new       # calls initialize
book.title = 'foo'    # calls title=
于 2013-09-04T00:36:47.573 回答