父级的子级构造函数参数

时间:2019-01-14 10:25:25

标签: ruby

父母如何获得孩子的构造函数参数?

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"

Parent模块现在不应使用args名称

3 个答案:

答案 0 :(得分:3)

一种方法是让“孩子”实现返回其参数的方法:

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

答案 1 :(得分:1)

如果您的模块包含在许多类中,并且您希望将instance variable个值显示为空格,那么您可以按照以下步骤进行操作,

仅使用红宝石

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

使用导轨

def print_args
  instance_values.values.join(' ')
end

答案 2 :(得分:1)

您在问如何获取“来自父级的构造函数参数” ,由于Ruby中几乎所有功能都是可能的:如果您真的很冒险(请阅读:不要这样做),您可以在包含Parent时覆盖new方法,以截取其参数并在实例上定义单例方法以打印参数:

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"

实例甚至不必将参数存储在实例变量中。