Функция, которая внедряет функцию уровня класса - PullRequest
0 голосов
/ 04 ноября 2018

Я пишу одну и ту же функцию несколько раз в моих классах. Есть ли способ объявить функцию один раз и просто ссылаться на объявление функции в каждом соответствующем классе, чтобы она стала частью класса? Я хочу сделать что-то вроде:

def add_func
  expand self.new_func
    puts "hello"
  end
end

class A
  import "add_func"
end

A.new_func
# >> hello world

Я хочу создать метод класса, а не метод экземпляра, но мне было бы интересно узнать, как сделать то и другое. Какую конструкцию Ruby я ищу?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Вы можете упаковать отдельные методы в свои собственные модули и расширить их:

module MyModule
  module NewFunc
    def new_func
      puts "hello"
    end
  end
end

class A
  extend MyModule::NewFunc
end

A.new_func

С помощью некоторого метапрограммирования / создания обезьян вы могли бы расширить только некоторые методы модуля, но я думаю, что подход, который я показал, работает достаточно хорошо.

Если вы хотите сделать так, чтобы отдельные методы могли быть импортированы, или вы можете импортировать все из них, вы можете сделать это так:

module MyModule
  module NewFunc
    def new_func
      puts "hello"
    end
  end

  module NewFunc2
    def new_func2
      puts "hello2"
    end
  end

  include NewFunc, NewFunc2 # this adds them to MyModule directly
end

class A
  extend MyModule
end

A.new_func
A.new_func2
0 голосов
/ 04 ноября 2018

Вы можете расширить методы следующим образом:

module SomeModule
  def foo
    true
  end
end

class SomeClass
  extend SomeModule
end

SomeClass.foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...