Если метод на модуле превращен в функцию модуля, можно просто отозвать его Модификаций, как будто он был объявлен как
module Mods
def self.foo
puts "Mods.foo(self)"
end
end
, подход module_function ниже постарается не повреждать любые классы, которые включают все Модификации.
module Mods
def foo
puts "Mods.foo"
end
end
class Includer
include Mods
end
Includer.new.foo
Mods.module_eval do
module_function(:foo)
public :foo
end
Includer.new.foo # this would break without public :foo above
class Thing
def bar
Mods.foo
end
end
Thing.new.bar
Однако мне любопытно, почему ряд несвязанных функций все содержится в том же модуле во-первых?
Отредактированный для показа это включает все еще работу, если public :foo
назван после module_function :foo
Другой способ сделать он, если Вы "владеете" модулем, должен использовать module_function
.
module UsefulThings
def a
puts "aaay"
end
module_function :a
def b
puts "beee"
end
end
def test
UsefulThings.a
UsefulThings.b # Fails! Not a module method
end
test
Если Вы хотите назвать эти методы без включения модуля в другом классе тогда, необходимо определить их как методы модуля:
module UsefulThings
def self.get_file; ...
def self.delete_file; ...
def self.format_text(x); ...
end
и затем можно назвать их с
UsefulThings.format_text("xxx")
или
UsefulThings::format_text("xxx")
, Но так или иначе я рекомендовал бы поместить просто связанные методы в один модуль или в один класс. Если у Вас есть проблема, что Вы хотите включать всего один метод от модуля тогда, это походит на плохой запах кода, и это не хороший стиль Ruby для соединения несвязанных методов.
Во-первых, я рекомендовал бы разбить модуль в полезные вещи, в которых Вы нуждаетесь. Но можно всегда создавать класс, расширяющий это для вызова:
module UsefulThings
def a
puts "aaay"
end
def b
puts "beee"
end
end
def test
ob = Class.new.send(:include, UsefulThings).new
ob.a
end
test
Не уверенный, если кому-то все еще нужен он после 10 лет, но я решил его с помощью eigenclass.
module UsefulThings
def useful_thing_1
"thing_1"
end
class << self
include UsefulThings
end
end
class A
include UsefulThings
end
class B
extend UsefulThings
end
UsefulThings.useful_thing_1 # => "thing_1"
A.new.useful_thing_1 # => "thing_1"
B.useful_thing_1 # => "thing_1"
I think the shortest way to do just throw-away single call (without altering existing modules or creating new ones) would be as follows:
Class.new.extend(UsefulThings).get_file