在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>