具有相同名称的功能有什么作用?

时间:2014-01-29 08:19:56

标签: ruby-on-rails 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 个答案:

答案 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)

稍微澄清Arup Rakshit's answer

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