Module方法返回NoMethodError

时间:2018-04-27 20:13:37

标签: ruby module nomethoderror

我试图在我的模块中创建一个方法,该方法返回一个给定参数的哈希。

module MyModule

  def self.my_method(*search_params)
    # do something...

    end
    self
  end
end

我已经看到了很多类似的问题,问题是因为我定义了一个实例方法,但我在定义中调用self并继续接收错误,让我相信它可能是其他的东西。

@example = { :name => 'John', :quote => 'Great fun!', :rank => 5 }
@example.my_method(:name => 'John') 

NoMethodError: undefined method `my_method` (NoMethodError)

2 个答案:

答案 0 :(得分:1)

我们无法理解您的方法尝试做什么,因为逻辑没有意义,但这是您将方法添加到Hash类的方法。

module MyModule
  def my_method(*search_params)
    puts "search params: #{search_params}"
  end
end


class Hash
  include MyModule
end

@example = { :name => 'John', :quote => 'Great fun!', :rank => 5 }
@example.my_method(:name => 'John')

#=>search params: [{:name=>"John"}]

然而,这被称为“猴子修补”,不建议这样做。使用继承可能会更好

module MyModule
  def monkey(*search_params)
    puts "search params: #{search_params}"
  end
end


class MonkeyHash < Hash
  include MyModule
end

@example = MonkeyHash.new(:name => 'John', :quote => 'Great fun!', :rank => 5)
@example.monkey(:name => 'John')

@example = { :name => 'John', :quote => 'Great fun!', :rank => 5 }

begin
  @example.monkey(:name => 'John')
rescue NoMethodError => e
  puts "Calling @exmaple.my_method raiesed: "
  puts e
  puts "@example is an instance of #{@example.class}. You may want to use MonkeyHash"
  puts "which includes the instance method 'monkey'"
end

或者你可以定义一个单例方法

puts "let's try it with a singleton method\n\n"

@singleton_example = { :name => 'John', :quote => 'Great fun!', :rank => 5 }

@singleton_example.define_singleton_method(:monkey) do |*search_params|
  puts "search params: #{search_params}"
end

puts "now @example has the monkey method see: \n"
@singleton_example.monkey(:name => 'John')
puts "@singleton_example is still an instance of #{@singleton_example.class}"

答案 1 :(得分:0)

@example是哈希的一个实例,而模块根本不包含在哈希类中。您需要先将其添加到Hash类中。

class Hash
  include MyModule
end

我建议你阅读Ruby类和模块的基础知识。