父母如何获得孩子的构造函数参数?
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名称
答案 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"
实例甚至不必将参数存储在实例变量中。