我自学了如何编码,似乎无法理解这门课程如何调用输入的标题。论证在哪里首先? attr_accessor或def标题capital_it(@title)结束了吗?
class Book
attr_accessor :title
def title
capital_it(@title)
end
def capital_it(title)
word_arr = @title.capitalize.split(" ")
word_arr.map do |word|
word.capitalize! unless little_words.include?(word)
end
word_arr.join(" ")
end
def little_words
["the", "a", "an", "and", "in", "of"]
end
end
答案 0 :(得分:2)
争论到底在哪里?
attr_accessor
或def title
...?
attr_accessor :title
为您定义了两种方法:title
(“读者”)和title=
(“作者”)。在def title
之后attr_accessor
进行title
时,您将使用新方法完全替换attr_accessor
方法。
换句话说,attr_writer
生成的方法永远不会被调用,因为你已经用自己的方法覆盖了它。
由于您正在编写自己的“阅读器”方法,因此您应该使用class Book
attr_writer :title
def title
capital_it(@title)
end
# ...
end
:
cd /some/path; source ./setup.bash
答案 1 :(得分:1)
首先,您的def capital_it(title)
方法存在问题。
.map
方法将返回一个您未分配给任何内容的新数组。如果您想将其重新分配给本地变量word_arr
,请使用.map!
。word.capitalize! unless little_words.include?(word)
重写为此little_words.include?(word) ? word : word.capitalize
P.S。在你的情况下它是有效的,因为你在每个元素字符串上使用capitalize!
,但这样的写作风格并不好。
所以我建议你像这样编写你的课程:
class Book
SKIP = %w(the a an and in of)
attr_writer :title
def initialize(title)
@title = title
end
def title
capital(@title)
end
private
def capital(title)
array = @title.split(/\s+/)
array.map! do |word|
SKIP.include?(word) ? word: word.capitalize
end
array.join(" ")
end
end