Как я могу импортировать только пару функций из модуля Ruby? - PullRequest
7 голосов
/ 31 марта 2009

Предположим, у меня есть модуль с методами: function1, function2, function3. Я хочу импортировать function1 и function2, но не function3. Есть ли способ сделать это в ruby?

Ответы [ 3 ]

6 голосов
/ 31 марта 2009

Не уверен, что есть простой способ просто добавить нужные методы, но вы можете удалить ненужные методы с помощью undef_method.

module Foo
  def function1
  end

  def function2
  end

  def function3
  end
end

module MiniFoo
  include Foo
  not_wanted_methods = Foo.instance_methods - %w(function1 function2)
  not_wanted_methods.each {|m| undef_method m}
end

class Whatever
  include MiniFoo
end
5 голосов
/ 31 марта 2009

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

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

5 голосов
/ 31 марта 2009

Аналогичное решение, но чуть более автоматическое. Я понятия не имею, какие странные вещи могут случиться, хотя.

module Foo
  def m1
    puts "Hello from m1"
  end

  def m2
    puts "Hllo from m2"
  end
end

class Module
  alias :__include__ :include
  def include(mod, *methods)
    if methods.size > 0
        tmp  = mod.dup
        new_mod = Object.const_set("Mod#{tmp.object_id}", tmp)
        toremove = new_mod.instance_methods.reject { |m| methods.include? m.to_sym }
        toremove.each { |m| new_mod.send(:undef_method, m) }
        __include__(new_mod)
    else
      __include__(mod)
    end
  end
end

class Bar
  include Foo
end

class Baz
  include Foo, :m2
end

bar = Bar.new
baz = Baz.new
p bar.methods - Object.methods
p baz.methods - Object.methods

=>

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