传统的test = method(arg)和test = send(method,arg)有什么区别?

时间:2013-05-09 16:53:24

标签: ruby

我在Rails应用程序的Order模型中,我希望为Email类的实例调用方法。

第一种方法采用Email类的实例(在本例中称为email)。它运作得很好。

def recursive_search_mails(user, settings)
  emails = user.emails.where(:datetime.gte => self.datetime)

  emails.each do |email|
    notification = email.test_if_notification(user, settings)
    if notification == true
      email.destroy
      return
    end
    correspondance = email.test_if_correspondance(user, settings)
    if correspondance == true
      email.destroy
      return
    end
  end
end

以上代码的更简洁版本就是这个:

def recursive_search_mails(user, settings)
  emails = user.emails.where(:datetime.gte => self.datetime)

  emails.each do |email|
    %w(notification, correspondance).each do |type|
      is_type = email.send("test_if_#{type}", user, settings)
      if is_type == true
        email.destroy
        return
      end
    end
  end
end

然而,它引发了这个错误:

2013-05-09T16:36:11Z 71266 TID-owr7xy0d0 WARN: undefined method `test_if_notification,' for #<Email:0x007fd3a3ecd9b0>

这怎么可能?

3 个答案:

答案 0 :(得分:4)

其他答案涉及逗号,我将解决方法之间的区别。

如果您事先不知道方法名称(在“代码写入时”,因为缺少编译时),则使用send调用方法。或者您知道,但执行“静态”调用会大大增加代码的复杂性(您的情况,使用重复的代码)。在这种情况下,需要调用动态调用(send)。

答案 1 :(得分:3)

%w文字前缀创建一个由空格分隔的标记数组。

您有%w(notification, correspondence),其中包含字符串“通知”(记下逗号)和“通信”。

摆脱逗号,你应该很好。

答案 2 :(得分:2)

你有一个不受欢迎的逗号

更改

%w(notification, correspondance)

%w(notification correspondance)