gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:22:42 24 4
gpt4 key购买 nike

我想在模块中添加一些代码,如果未定义某些方法会抛出错误。此模块依赖于此方法的外部定义,因为此方法的实现对于所有类都是不同的。此代码将帮助开发人员及早知道他们忘记了实现该方法,而不是在他们尝试使用模块的功能时知道。

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_missingdefine_method

如果您确实使用了method_missing,请不要忘记:

  • 为未处理的情况调用 super
  • 还实现了一个respond_to?方法

this question , 加上 thisthat .

更新:

听起来目标是像 Java 或 C++ 那样进行静态方法检查。这在 ruby​​ 中没有真正意义:-(

因为在 ruby 中:

  • 对象的每个实例都有自己的特征类。给定的对象可能在运行时混合了必要的方法。所以仅仅因为 Foo 在类加载时没有方法是没有意义的。
  • 像 RoR 这样的框架 Hook 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

因此,也许开发人员按照私有(private)约定将 check_class 方法调用添加到相关类的底部?

我理解其意图,但它似乎与 ruby​​ 的设计工作方式相悖。

作为一个主要使用 Java 的人,我很感激这种挫败感。让我猜猜:重复的代码案例被推送到缺少方法的生产中? :-P

更新2:

wrt onload 在 ruby​​ 中,禁止使用 frozen 类始终获取定义的新方法。 (或者一个实例可以获得仅为该实例定义的新方法。)因此检查方法是否存在只是一个快照检查,而不是像静态语言带到表中那样的确定性检查。这是 ruby​​ 自己的 Halting problem

关于Ruby:如果找不到类方法,则在模块中引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com