在Ruby中是否可以通过哈希访问关键字参数?
我知道我能做到:在Ruby中是否可以通过哈希访问关键字参数?,ruby,Ruby,我知道我能做到: 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 但是有没有可能写得更短,而不是@x=x@y=y从传递的关键字参数初始化实例变量?有可能以散列的形式访问传
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
但是有没有可能写得更短,而不是
@x=x@y=y
从传递的关键字参数初始化实例变量?有可能以散列的形式访问传递的关键字参数吗?我不建议使用它(因为eval
!),但这是我能想到的唯一方法,因为我认为没有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>
#对象对于传入的符号,方法返回当前方法的名称,方法#参数
返回描述方法接受的参数的数组。这里我只设置类型为:key
(命名参数)的参数。如果有关键字参数,使用哈希的目的是什么?@DaveNewton,一次对所有关键字参数进行编程访问。@DaveNewton能够更容易地初始化与关键字参数的key同名的实例变量谢谢,我不知道\uuuuuuuuuuuuuuuuuuuuuuuuuu
。我想让我的代码变得越来越不可读,但这并不能让它变得更可读,因为我似乎无法将此代码移动到父级eval(#{name}”)
应该等于name
,不是吗?为什么您需要eval
?在Ruby版本>=2.1中,您可以不使用eval
就可以做到这一点。将eval(“{name}”)
替换为绑定。局部变量\u get(name)
eval({name}”)
不等于name
name
是一个:符号,因此您只需执行以下操作即可,例如,@param1=:param1
#<A:0x007fd7e21008d0 @param1=20, @param2=23>
#<A:0x007fd7e2100218 @param1=3, @param2=4>