Avy*_*jan 1 ruby method-missing
我的程序中有一个 Team 类,我正在尝试使用 method_missing,但是当该方法不存在时,它没有运行该函数,而是给了我一个错误:“Team:Class 的未定义方法 `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
Run Code Online (Sandbox Code Playgroud)
您的代码存在许多问题。让我们一一过去。
从文档中,
method_missing(*args) private 当 obj 收到它无法处理的消息时由 Ruby 调用。
这里message指的是method。在 ruby 中,每当你在一个对象上调用一个方法时,你实际上send是message在object
为了更好地理解这一点,在 irb shell 中试试这个。
1+2
=> 3
1.send(:+,2)
=> 3
Run Code Online (Sandbox Code Playgroud)
这里 1 和 2 是Fixnum类的对象。您可以使用1.class. 好的,回到你的问题。因此,method_missing应该在实例上调用方法。
team = Team.new
team.hawks
Run Code Online (Sandbox Code Playgroud)
如果你尝试上面的代码,你会得到一个错误说 'fetch': key not found: :roster (KeyError)
您可以通过将 adefault value作为第二个参数传递给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
Run Code Online (Sandbox Code Playgroud)
结尾
如果您执行该脚本,您会stack level too deep (SystemStackError)因为这一行中的一个小错字而得到。
str = methID.id2name
Run Code Online (Sandbox Code Playgroud)
在方法定义中,您收到一个名称为 的参数,methId但在内部您试图调用methID. 修复它
str = methId.id2name
Run Code Online (Sandbox Code Playgroud)
如果你执行你的脚本,你会再次得到一个错误说 undefined method uppercase for "hawks":String (NoMethodError)
这是因为uppercase字符串没有方法。您应该改为使用该upcase方法。
Team.new(roster:[], per: 0, name: str.upcase, best: 0)
Run Code Online (Sandbox Code Playgroud)
你应该很高兴去。
有关更多信息,请参阅http://apidock.com/ruby/BasicObject/method_missing
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |