我被分配编写一些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”。
答案 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