0

我被分配编写一些 ruby​​ 代码,这些代码将与以下(a 段)rspec 测试一起使用:

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
  attr_reader :title

  def title=(new_title)
    words = new_title.split(" ")
    words = [words[0].capitalize] +
      words[1..-1].map do |word|
        little_words = %w{a an and the in of}
        if little_words.include? word
          word
        else
          word.capitalize
        end
      end
    @title = words.join(" ")
  end

end

我认为我推断出@book.title = "inferno"将运行该方法并最终为底部title的变量创建一个新值是正确的。@title我知道这会导致@book.title更新为“Inferno”(大写),但我不知道为什么。这是def title某种可变方法的情况,并且@title是最终值吗?这是我目前最好的猜测。

编辑以防不清楚,我不明白为什么将@book.title ='inferno'原因设置@book.title为更新为“地狱”。

4

2 回答 2

2

当你在 Ruby 中有 setter 和 getter 方法时:

attr_writer :something
attr_reader :something

从我对此的一点了解来看,这些方法相当于

def something=(value)
  @something = value
end

def something
  @something
end

分别。

或者在一种说法中,它可能是:

attr_accessor :something

无论如何,您正在做的是自己编写 setter 方法,将作为参数传递的字符串的每个单词大写。

于 2013-10-18T06:49:28.827 回答
2

你的理解几乎是正确的。这是一个简单的例子

 class Chapter
   attr_reader :title
   def title=(new_title)
     @title = new_title.reverse
   end
 end

 @c = Chapter.new
 @c.title = "ybuR"
 @c.title #=> Ruby
于 2013-10-18T06:57:52.683 回答