加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby:如果找不到类方法,则在Module中引发错误

发布时间:2020-12-17 04:04:11 所属栏目:百科 来源:网络整理
导读:我想在模块中放入一些代码,如果没有定义某个方法,则抛出错误. 此模块依赖于此方法的外部定义,因为此方法的实现对所有类都不同.此代码将帮助开发人员尽早知道他们忘记实现该方法,而不是在他们尝试使用模块的功能时. module MyModule def self.included(klass)
我想在模块中放入一些代码,如果没有定义某个方法,则抛出错误.
此模块依赖于此方法的外部定义,因为此方法的实现对所有类都不同.此代码将帮助开发人员尽早知道他们忘记实现该方法,而不是在他们尝试使用模块的功能时.

module MyModule
  def self.included(klass)
    raise "MyModule: please `def my_method` on #{klass}" unless klass.respond_to?(:my_method)
  end
end

如果没有定义方法,我可以很容易地在模块的包含定义中引发错误,但是由于大多数模块都包含在文件的顶部,所以我的必需方法很可能是在类中定义的,而不是在我的模块包含之前.

class MyClass
  include MyModule
  def self.my_method
    # ...
  end
end

这仍然会引发错误:(

只有在类定义中没有定义方法时才可能引发错误吗?几乎需要一个class.onload回调的排序.如果没有,关于如何减少程序员可能包含我们模块的可能性而没有定义这种所需方法的任何其他想法?

解决方法

听起来你想要使用method_missing和define_method.

如果使用method_missing,请不要忘记:

>为未处理的案件打电话.
>还实现了respond_to?方法

看看this question,再加上this和that.

更新:

听起来我的目标是像Java或c那样进行静态方法检查.这在ruby中真的没有意义:-(

因为在ruby中:

>对象的每个实例都有自己的特征类.给定对象可能在运行时混合了必要的方法.所以只是因为Foo在类加载时没有方法是没有意义的.
>像RoR一样的框架钩子method_missing并动态创建数据库查询方法所需的方法,因此在需要时可以存在(或不存在)方法.

关于“加载类”:真正执行类定义.试试这个:

class Foo 
  p "Hi"
end

您将在第一次使用Foo时看到“Hi”.这就是像devise这样的事情如何勾结他们的魔力.

class User < ActiveRecord::Base
  # **CALL 'devise' method**
  devise :database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable

  # **CALL attr_accessible method**
  attr_accessible :email,:password,:password_confirmation
end

所以也许通过私有约定开发人员可以在相关类的底部添加一个check_class方法调用?

我理解这个意图,但似乎正在与ruby的设计方式作斗争.

作为一个主要是Java的人,我很欣赏这种挫败感.让我猜一下:重复的代码案例被推到生产中,缺少方法?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读