使用gem时main:Object的未定义方法错误

时间:2019-06-01 19:47:45

标签: ruby rubygems bundler

测试出一颗宝石,弄清楚逻辑门实际上要多少费劲(如果没用的话),所以我使用它们。我的lib / logic.rb文件中有以下代码:

require "logic/version"

module Logic
  def or_gate(a, b)
    a || b
  end

  def and_gate(a, b)
    a && b
  end

  def nand_gate(a, b)
    !(a && b)
  end

  def nor_gate(a, b)
    !(a || b)
  end

  def not_gate(a)
    !a
  end

  def xor_gate(a, b)
    !(a == b)
  end

  def xnor_gate(a, b)
    a == b
  end
end

我可以毫无问题地构建和安装gem,但是当使用irb进行测试时,例如,调用or_gate方法时,只会返回“ NoMethodError:main:Object”的未定义方法“ or_gate”。

Logic.or_gate

Logic::Gate.or_gate 

(Gate类中的放置方法)都具有相同的问题。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您已定义了实例方法,而不是模块方法。更改:

def or_gate(a, b)

收件人:

def self.or_gate(a, b)

它将按照您期望的方式工作:

Logic.or_gate(1,2)
 => 1

对所有方法定义重复此更改。

或者,您可以使用extend self完成相同的目标,而不必在每个方法定义中添加self.

module Logic
  extend self

  def or_gate(a, b)
    a || b
  end
end

这会将所有实例方法添加/复制为模块方法。

对此here进行了更多讨论,this answer进一步详细介绍了如何在模块中定义方法。