繁体   English   中英

为什么要在Ruby中的类上调用实例方法?

Reason for calling an instance method on a class in Ruby?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想知道这样做的原因是什么,还是某人犯了一个愚蠢的错误(或者是我不理解的其他事情)。

class SomeMailer < ActionMailer::Base
  def first_method(user)
    mail(to: user.email, subject: "Testing")
  end
end

在代码中的其他位置调用此方法,如下所示

SomeMailer.first_method(user).deliver
3 个回复

ActionMailer::Base类很奇怪...是的,您确实确实在类上调用了实例方法-显然,这些方法不适用于“普通”类!

但是幕后有一些元编程魔术

module ActionMailer
  class Base < AbstractController::Base
    def method_missing(method_name, *args) # :nodoc:
      if action_methods.include?(method_name.to_s)
        MessageDelivery.new(self, method_name, *args)
      else
        super
      end
    end
  end
end

如果您浏览Rails文档 ,您会发现在类上调用实例方法很奇怪,这是邮件程序的正常工作。

这就是导轨的预期工作方式。 在Rails指南中还提到

您永远不会实例化您的邮件程序类。 相反,您只需调用在类本身上定义的方法。

Rails通过调用method_missin进行内部处理。 基本上,在mailer类中定义的任何操作方法都将被method_missing拦截,并将返回MessageDelivery的实例,否则它将运行默认实现。 行动方法从何而来? ActionMailer :: Base继承自AbstractController :: Base,因此它的工作原理与控制器完全相同-它返回给定类的一组公共实例方法。

Rails本身鼓励这种行为。 有关更多信息,您可以参考此链接

我将尝试回答这个问题,因为我在处理现有代码时遇到了类似情况。

当你调用一个类背上的实例方法是这样一类的帮助。 例如,如果要对从该类创建的对象执行某些操作。

假设您有另一个班级用户,并且要在创建新用户后立即向该用户发送电子邮件。 在这种情况下,您可以通过执行以下操作在该对象上调用此方法

after_save :method_name

1 为什么我允许在类上调用实例方法?

在昨天收到一个问题的帮助后,我仍然无法完全理解这个问题,或者为什么允许以下内容: 对我来说,这看起来就像是直接从类中调用实例方法。 在上面的例子中,它没有特别的意义,但它显然是允许的,因为它既没有警告也没有任何错误地运行。 任何帮助消除我对Swift的无知的巨大无知的任何帮助都将 ...

2 如何在Ruby中调用类的所有实例方法?

我目前正在努力将自己的小测试方法运行器脚本放在一起。 我需要某种方法来调用类中的所有方法。 当我调用run_tests方法时,我的程序陷入了无限循环。 是什么原因造成的,有什么解决方案? ...

5 如何在片段类上调用实例方法?

我有一个片段Movies ,可以将数据库适应列表视图。 这个片段类的一个辅助方法是swapCursor 我需要能够从Movies类外部访问swapCursor方法。 我无法使swapCursor静态,因为我无法调用getActivity 。 我如何访问swapCursor ? ...

2017-01-09 06:44:40 2 80   android
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM