【问题标题】:NoMethodError when using hook methods in ruby 2.0在 ruby​​ 2.0 中使用钩子方法时出现 NoMethodError
【发布时间】:2014-03-14 08:02:52
【问题描述】:

我正在学习 Code School 的 Ruby Bits 课程,在第 5 级,它们涵盖了模块。

在钩子方法部分,为 LibraryUtils 模块添加一个 self.included 方法钩子是一个挑战,它将扩展传入类的 ClassMethods。代码如下:

module LibraryUtils

  def add_game(game)
  end

  def remove_game(game)
  end

  module ClassMethods
    def search_by_game_name(name)
    end
  end
end

class AtariLibrary
  include LibraryUtils
  extend LibraryUtils::ClassMethods
end

非常简单易行。首先将上述方法包含在我们的模块中,如下所示:

def self.included(base)
  base.extend(ClassMethods)
end

然后只需取出扩展名,这样我们就不会出现重复了。

问题是,当我在使用 Ruby 2.0 的 codeschool 环境(浏览器)之外尝试此操作时,我得到一个无方法错误:

atari_library.rb:27:in `<main>': undefined method `search_by_game_name' for #<AtariLibrary:0x2b07ef8> (NoMethodError)

请记住,我使用的是相同的代码。

如果有人对此有任何想法,我将不胜感激。

【问题讨论】:

  • 你能说明你是如何调用这个方法的吗?
  • 你在你的答案中得到了它!我正在做你展示的底部(错误)示例。谢谢

标签: ruby ruby-2.0


【解决方案1】:

我在这里唯一能想到你做错的事情是在 AtariLibrary 的实例而不是类上调用 search_by_game_name,例如:

AtariLibrary.search_by_game_name('name') # => works

al = AtariLibrary.new
al.search_by_game_name('name') # undefined method `search_by_game_name' for #<AtariLibrary:0x007fe3e204ebb0> (NoMethodError)

【讨论】:

  • 类方法是在类上调用的方法,因此在这种情况下 AtariLibrary 是一个类。您可以使用 #new 方法创建它的实例,该方法允许您调用实例方法;-) 如果您不确定类和实例之间的区别,请查看:railstips.org/blog/archives/2009/05/11/…
  • 或者你不确定为什么 ClassMethods 会变成类方法?也许包含模块与扩展模块之间的区别?
  • 是的,我不知道类和实例方法之间的区别!您发布的链接很棒,帮助很大!!再次感谢您。
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多