Ruby: использовать метод модуля внутри метода класса - PullRequest
0 голосов
/ 07 сентября 2018

Как использовать метод модуля внутри метода класса без расширения модуля?

module TestModule
  def module_method
    "module"
  end
end

class TestClass
  include TestModule

  def self.testSelfMethod
    str = module_method
    puts str
  end
  TestClass.testSelfMethod
end

Затем возвращается:

test.rb:11:in `testSelfMethod': undefined local variable or method `module_method' for TestClass:Class (NameError)

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Только потому, что в комментариях слишком мало символов, но согласен с maegar :

module TestModule
  def module_method
    "module"
  end
end

class TestClass

  def self.testSelfMethod
    str = module_method + " from class"
    puts str
  end

  def testSelfMethod
    str = module_method + " from instance"
    puts str
  end
end

TestClass.extend TestModule
TestClass.testSelfMethod # => module from class

TestClass.include TestModule
TestClass.new.testSelfMethod # => module from instance
0 голосов
/ 07 сентября 2018

Включая модуль, вы делаете module_method методом instance для TestClass, что означает, что вам нужно вызывать его для экземпляра класса, а не для самого класса.

Если вы хотите создать метод для самого класса, вам нужно extend TestModule, а не include it.

module TestModule
  def module_method
    "module"
  end
end

class TestClass
  extend TestModule # extend, not include

  def self.testSelfMethod
    str = module_method
    puts str
  end
  TestClass.testSelfMethod # "method"
end
...