我正在学习红宝石,并且不能在它的生命中找出它的作用:
def topic_list
topics.map(&:name).join(",")
end
def topic_list=(names)
if names.present?
topics = names.split(",")
self.topics = topics.map do |n|
unless topic = Topic.find_by(slug: n)
topic = Topic.create!(name: n)
end
topic
end
end
end
为什么两个函数具有相同的名称?第一个函数是否调用第二个函数?
答案 0 :(得分:5)
topic_list
是 getter ,topic_list=
是 setter 方法。不,他们不是相同的方法。
这个问题Trying to learn / understand Ruby setter and getter methods将有助于作为这一概念的基本食物。所以阅读它。
方法self.topics = topics.map...
中的行topic_list=
和方法topics.map(&:name).join(",")
中的topic_list
行闻起来有一个叫做topics
的getter和setter {{1 }}。通过查看你的代码,我确信(如果你告诉这段代码可以做到这一点)。
答案 1 :(得分:1)
Ruby允许在其方法中使用一些“怪异”字符,这些字符通常在其他语言中看不到。最值得注意的是?
,!
和=
。
因此,您可以定义方法:
def answered?()
not @answer.nil?
end
def answer!()
@answer = Answer.new
end
def answer()
@answer
end
def answer=(answer)
@answer = answer
end
对于来自PHP的人来说,这看起来很奇怪。但实际上他们都是不同的方法!我在任何地方都添加了括号,以澄清我的观点,但在Ruby中,你可以将它们关闭,所以当一个方法不接受参数时,人们通常会将它们关闭。
def answer()
end
def answer
end
是一样的。
最后两个,answer()
和answer=()
,通常被称为getter和setter。第一个通常用于测试二进制文件,例如has_question?
或valid?
。第二种方法称为 bang 方法answer!
,更常用于修改自身的方法,例如some_array.merge!(other_array)
,它会修改some_array
。