我知道我能做到:
class Parent
def initialize(args)
args.each do |k,v|
instance_variable_set("@#{k}", v)
end
end
end
class A < Parent
def initialize(attrs)
super(attrs)
end
end
但我想使用关键字参数来更清楚地说明哪些哈希键方法可以接受(并且验证说不支持此密钥)。
所以我可以写:
class A
def initialize(param1: 3, param2: 4)
@param1 = param1
@param2 = param2
end
end
但是有可能写一些更短而不是@x = x; @y = y; ...
来从传递的关键字参数初始化实例变量吗?是否可以将传递的关键字参数作为哈希访问?
答案 0 :(得分:5)
我不建议使用(因为eval
!),但这是我能想到的唯一方法,因为我认为没有办法获得没有{{的局部变量的值1}}。
eval
输出:
class A
def initialize(param1: 3, param2: 4)
method(__method__).parameters.each do |type, name|
if type == :key
instance_variable_set "@#{name}", eval("#{name}")
end
end
end
end
p A.new param1: 20, param2: 23
p A.new
#<A:0x007fd7e21008d0 @param1=20, @param2=23>
#<A:0x007fd7e2100218 @param1=3, @param2=4>
为传入的符号返回Method
个对象,method
返回当前方法的名称,__method__
返回一个数组,描述方法接受的参数。这里我只设置类型为Method#parameters
的参数(命名为params)。