Неопределенная ошибка метода для main: Object при использовании gem - PullRequest
1 голос
/ 01 июня 2019

Тестирование создания драгоценного камня, фигурных логических вентилей было бы более или менее легким (если вообще бесполезным) реализовать, поэтому я использовал их.У меня есть этот код в моем файле 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

Я могу собрать и установить гем без проблем, но при тестировании с помощью irb вызов метода or_gate, например, просто возвращает "NoMethodError: undefinedМетод 'or_gate' для main: Object '. Делая что-то вроде

Logic.or_gate

или

Logic::Gate.or_gate 

(помещение методов в класс Gate), обе имеют одну и ту же проблему. Что я делаюне так?

1 Ответ

1 голос
/ 01 июня 2019

Вы определили методы экземпляра, а не методы модуля. Изменения:

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

Это добавляет / копирует все методы экземпляра как методы модуля.

Здесь более подробно обсуждается здесь , и этот ответ дает более подробные сведения о том, как методы определяются в модулях.

...