Аргументы дочернего конструктора от родителя - PullRequest
0 голосов
/ 14 января 2019

Как родитель может получить аргументы конструктора дочернего элемента?

class A
  include Parent

  def initialize(foo, bar)
    @foo = foo
    @bar = bar
  end
end 

class B
  include Parent

  def initialize(foo)
    @foo = foo
  end
end 

module Parent

  def print_args
    # here is the code for print args of child, this is not real code
    puts Child.args # this is not real code 
  end  

end

Ожидаемое поведение будет:

a = A.new('hello', 'world')
a.print_args
=> "hello world"

b = B.new('hello')
b.print_args
=> "hello"

Родительский модуль теперь не должен именовать аргументы

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Один из способов заключается в том, чтобы «потомки» реализовали метод, который возвращает их аргументы:

class A
  include Parent

  def initialize(foo, bar)
    @foo = foo
    @bar = bar
  end

  def args
    [@foo, @bar]
  end
end

class B
  include Parent

  def initialize(foo)
    @foo = foo
  end

  def args
    [@foo]
  end
end

«Родитель» может затем вызвать этот метод, не зная его реализацию:

module Parent
  def print_args
    puts args.join(' ')
  end
end
0 голосов
/ 14 января 2019

Вы спрашиваете, как получить "аргументы конструктора от родителя" , и поскольку в Ruby возможно почти все: если вы действительно любите приключения (читай: не делайте этого), вы может переопределить метод new после включения Parent, чтобы перехватить его аргументы и определить одноэлементный метод в экземпляре, который печатает аргумент:

module Parent
  def self.included(mod)
    def mod.new(*args)
      super.tap do |instance|
        instance.define_singleton_method(:print_args) do
          puts args.join(' ')
        end
      end
    end
  end
end

Пример использования:

class A
  include Parent

  def initialize(foo, bar)
  end
end

A.new('hello', 'world').print_args
# prints "hello world"

Экземпляру даже не нужно хранить аргументы в переменных экземпляра.

0 голосов
/ 14 января 2019

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

используя только ruby,

def print_args
  instance_variables.map { |x| instance_variable_get(x) }.join(' ')
end

с использованием рельсов,

def print_args
  instance_values.values.join(' ')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...