在Ruby中使用method_missing
时,它almost always a good idea也可以定义respond_to_missing?
。
respond_to_missing?
有两个论点;我们正在检查的方法的名称(symbol
),以及一个布尔值,它指示我们是否应该在检查中包含私有方法(include_all
)。
现在我对此感到困惑:method_missing
没有采取任何可能表明是否应该调用私有方法的参数,如respond_to_missing?
}。此外,无论原始方法调用是在公共或私有上下文中,并且无论method_missing
在适当的上下文中为给定方法返回什么,都会调用respond_to_missing?
。因此method_missing
的所有操作都可以公开访问。
如果是这种情况,那么respond_to_missing?
(include_all
)的第二个参数的用途是什么?给定对象是否响应缺少的方法不能受到调用缺失方法的上下文的影响,那么为什么甚至要有这个参数呢?
答案 0 :(得分:3)
我认为respond_to_missing?
有第二个参数,原因与respond_to?
相同。在这两种情况下,它都允许代码以一种尊重方法隐私的方式向对象询问它响应的方法。如果使用得当,它可以帮助您更好地封装对象。
您已在method_missing
中指出了一个缺少的功能,即它应该有一个参数,说明该方法是在公共或私有环境中调用的。也许method_missing
有一天会有这个功能。在此之前,通过method_missing
实现的对象的所有功能都将实际公开,但您仍然可以阻止人们在您的文档中使用它并通过respond_to_missing?
。
答案 1 :(得分:0)
method_missing不会接受任何可能指示它的参数 是否应该调用私有方法
method_missing()不会调用公共或私有方法。当无法找到方法时,在方法查找路径的最后调用method_missing()。所以比较method_missing()和respond_to *是非感性的。为什么你认为他们必须以同样的方式运作? respond_to?()从来没有与method_missing()对称。