测试出一颗宝石,弄清楚逻辑门实际上要多少费劲(如果没用的话),所以我使用它们。我的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类中的放置方法)都具有相同的问题。我在做什么错了?
答案 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进一步详细介绍了如何在模块中定义方法。