Ruby 是否可以覆盖接收器行为?
假设我有一门课是这样的:Ruby 是否可以覆盖接收器行为?,ruby,Ruby,假设我有一门课是这样的: class User def initialize(name, id) @name = name @id = id end def name @name end def id @id end end 在这种情况下,如果我用u=user.new(“Joe”,5)初始化用户,调用u.name将返回“Joe”。但是如果我调用一个未知的方法,例如User.location,我将得到一个NoSuchMethodEx
class User
def initialize(name, id)
@name = name
@id = id
end
def name
@name
end
def id
@id
end
end
在这种情况下,如果我用u=user.new(“Joe”,5)
初始化用户,调用u.name
将返回“Joe”
。但是如果我调用一个未知的方法,例如User.location
,我将得到一个NoSuchMethodException
是否有方法重写接收方行为或User
类,以便在调用User.location
时,它只返回一个nil
值
我尝试了monkeypatch
send
方法,但该方法仅在调用User.send:location
时有效 答案似乎包括覆盖类的方法\u missing
方法。正如一位评论者所说,你可以这样做
def method_missing(method_name, *args)
nil
end
这里有更多信息:.
def method\u缺失(method\u name,*args);结束
就可以了。现在,任何不存在的方法都将返回nil
(我决不赞同这一点)@engineersmnky刚刚在你发布后5秒左右的wiki页面上发现了这一点。谢谢不,那根本不是我说的。如果我见过的话,你发布的是堆栈级错误method\u missing
将捕获一个NoMethodError
并尝试处理它,但您正在通过再次调用相同的方法来处理它,这现在只是一个恶性循环,直到程序崩溃。我意识到了我的错误,我不知道为什么irb在编辑这篇文章时没有捕获到它。我会在今天编辑它。