使用 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 更详细地介绍了如何在模块中定义方法。
测试制作 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所有实例方法作为模块方法。
对此有更多讨论