一种改变setter结果的方法

时间:2013-10-18 06:24:00

标签: ruby-on-rails ruby rspec

我被分配编写一些ruby代码,可以使用以下(一段)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更新为“Inferno”。

2 个答案:

答案 0 :(得分:2)

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

attr_writer :something
attr_reader :something

从我对此的一点理解,这些方法等同于

def something=(value)
  @something = value
end

def something
  @something
end

分别

或者在一个声明中,它可能是:

attr_accessor :something

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

答案 1 :(得分: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