8

我知道我可以做到:

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; ...从传递的关键字参数初始化实例变量?是否可以访问作为哈希传递的关键字参数?

4

1 回答 1

5

不是我推荐使用的东西(因为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>

method返回Method传入符号的对象,__method__返回当前方法的名称,并Method#parameters返回描述该方法接受的参数的数组。这里我只设置了类型:key(命名为 params)的参数。

于 2013-05-17T17:46:11.180 回答