gpt4 book ai didi

ruby - Method_missing 没有在应该运行的时候运行

转载 作者:太空宇宙 更新时间:2023-11-03 17:45:25 25 4
gpt4 key购买 nike

我的程序中有一个团队类,我正在尝试使用 method_missing但是当该方法不存在时它没有运行该函数,而是给我一个错误:“团队的未定义方法‘hawks’(NoMethodError)”

我的代码如下:

class Team
attr_accessor :cust_roster, :cust_total_per, :cust_name, :cust_best_player
@@teams = []
def initialize(stats = {})
@cust_roster = stats.fetch(:roster) || []
@cust_total_per = stats.fetch(:per)
@cust_name = stats.fetch(:name)
@cust_best_player = stats.fetch(:best)
@@teams << self

end
def method_missing(methId)
str = methID.id2name
Team.new(roster:[], per: 0, name: str.uppercase, best: 0)

end



class <<self
def all_teams
@@teams
end
end

end
hawks = Team.hawks

最佳答案

您的代码存在许多问题。让我们一一道来。

来自文档,

method_missing(*args) privateInvoked by Ruby when obj is sent a message it cannot handle.

这里的message指的是method。在 ruby​​ 中,无论何时在对象上调用方法,实际上都是在向 对象发送消息

为了更好地理解这一点,请在 irb shell 中尝试这个。

1+2
=> 3
1.send(:+,2)
=> 3

这里 1 和 2 是 Fixnum 类的对象。您可以使用 1.class 来确认这一点。好的,回到你的问题。因此,应该在实例上调用 method_missing 方法。

team = Team.new
team.hawks

如果您尝试上面的代码,您会收到一条错误消息:'fetch': key not found: :roster (KeyError)

您可以通过将 默认值 作为第二个参数传递给 fetch 方法来解决这个问题。将您的 initialize 方法替换为

def initialize(stats = {})
@cust_roster = stats.fetch(:roster, [])
@cust_total_per = stats.fetch(:per, 0)
@cust_name = stats.fetch(:name, "anon")
@cust_best_player = stats.fetch(:best, "anon")
@@teams << self

结束

如果您执行该脚本,您将得到一个堆栈级别太深 (SystemStackError),因为此行中有一个小错字。

str = methID.id2name

在方法定义中,您收到一个名称为 methId 的参数,但在内部您试图调用 methID。修复它

str = methId.id2name

如果你执行你的脚本,你会再次得到一个错误,说 undefined method uppercase for "hawks":String (NoMethodError)

这是因为字符串没有uppercase方法。您应该改为使用 upcase 方法。

Team.new(roster:[], per: 0, name: str.upcase, best: 0)

你应该可以开始了。

有关更多信息,请参阅 http://apidock.com/ruby/BasicObject/method_missing

希望这对您有所帮助!

关于ruby - Method_missing 没有在应该运行的时候运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39029915/

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