gpt4 book ai didi

ruby - 我可以通过猴子修补 NilClass 来为缺少的方法返回 nil 吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:45:58 28 4
gpt4 key购买 nike

在其他语言中(例如 objective-c)在 nil 对象上调用方法会静默失败并返回 nil 但在 ruby​​ 中你会得到这样的错误...

undefined method `some_method' for nil:NilClass

这(对我而言)会产生如下代码:

if some_object && some_object.cool?  # instead of if some_object.cool?
# do some cool stuff
end

some_object.do_awsome_thing if some_object

这一切都显得倒退和怪异。

两个问题

  1. 我做错了什么,处理可能出现 nil 对象的正确方法是什么

  2. 如果我只是猴子修补 nil 对象以针对 missing_methods 返回 nil,会发生什么样的可怕事情?

即:

class NilClass
def missing_method
nil
end
end

最佳答案

这是一个设计选择,我认为 nil 可以用 nil 来响应它不知道的方法。

为了保持一致,您应该定义 respond_to_missing? :

class NilObj
def method_missing(*_)
nil
end
def respond_to_missing?(*_)
true
end
end

如果你像你建议的那样做了 monkey patch method_missing,特别是如果你也相应地重新定义了 respond_to_missing?,你可能会得到一些奇怪的副作用,因为 duck typing 需要一些内省(introspection)这通常是通过检查对象是否响应特定类以外的内容来完成的。

例如,nil 会响应 to_ary 这一事实似乎表明它是“类数组”,但事实并非如此。

一些内置方法会调用 respond_to?,还有一些会简单地调用并挽救 NoMethodError,因此即使没有 respond_to_missing?,您也可以得到一些奇怪的副作用。

关于ruby - 我可以通过猴子修补 NilClass 来为缺少的方法返回 nil 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9747086/

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