2014-01-29 98 views
3

我学习Ruby并不能为它的生命找出这样做:具有相同名称的功能是做什么的?

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 

为什么两个函数具有相同的名称?第一个函数调用第二个函数吗?

+2

仔细观察:它们*不具有相同的名称。一个名为'topic_list',另一个名为'topic_list ='。 –

回答

5

topic_list吸气topic_list=设定器方法。不,他们不是相同的方法。

这个问题Trying to learn/understand Ruby setter and getter methods将有助于这个概念的基本食物。所以阅读它。

线self.topics = topics.map...在该方法中topic_list=,并且在该方法中topics.map(&:name).join(",")线topic_list气味有称为topics和setter topics=一个消气部件。我确信(如果你告诉这段代码很有效),通过查看你的代码。

+0

@Hopstream不,它不是那样的。 OP采纳了部分代码,以了解该主题。 –

+0

如果getter没有任何参数,getter如何得到':name'?在这里:'topics.map(&:name).join(“,”)' – user3188544

+1

@ user3188544我确定在'topic_list ='方法中使用'self.topics ='。所以显然存在一个实例变量'@ topics',并且必须存在getter'topics'和setter'topics ='。 –

1

为了澄清更多Arup Rakshit's answer一点:

红宝石允许在其方法的一些“怪异”的字符,你通常不会在其他语言中看到。最值得注意的是?,!=

所以,你可以定义方法:

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=(),通常被称为getters和setter。第一个常用于测试二进制文件,如has_question?valid?。第二个被称为bang方法,answer!,更经常用于修改自身的方法,如some_array.merge!(other_array),它修改some_array

相关问题