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

Undefined method error for main:Object when using gem

测试制作 gem,认为逻辑门或多或少会毫不费力地(如果没用的话)实际实现,所以我使用了它们。我的 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 方法进行测试时,例如 returns 一个“NoMethodError:未定义的方法 'or_gate' 对于 main:Object'。做类似

的事情
Logic.or_gate

Logic::Gate.or_gate 

(将方法放在门 class 中)都有同样的问题。我做错了什么?

您定义了实例方法,而不是模块方法。变化:

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

这adds/copies所有实例方法作为模块方法。

对此有更多讨论 , and this answer 更详细地介绍了如何在模块中定义方法。