在Ruby中使用正确数量的参数

时间:2011-11-19 07:06:51

标签: ruby metaprogramming

我正在制作一个可以使用不同版本的Gherkin的宝石,但我遇到了一个问题: 在2.4.0版本中,Gherkin :: Formatter :: Model :: Scenario.new需要6个参数,但在2.6.5中需要7个参数。

所以我的问题是这种情况下的最佳做法是什么?我应该这样做:

case Gherkin::Version
when '2.4.0'
  do the init with 6 arguments
else
  with the 7 
end

我还在考虑创建一个new_with_arity方法:

class Object
  def new_with_arity(*params)
    puts method(:initialize).arity # => -1
    puts method(:new).arity        # => -1
    new(*(params + [nil] * (params.count - method(:new).arity)))
  end
end

然而,这不起作用,new和initialize的arity是-1。 你有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我会构建2个Gherkin适配器并加载适当版本的适当版本。或者,您正在使用Rubygems,因此您可以强制使用特定版本的Gherkin解析器

答案 1 :(得分:2)

我建议遵循Jim Deville的建议。说这是一个非常有趣的想法,你非常接近。问题是你没有实例就无法获得方法,所以诀窍是先使用allocate。

class Object
  def new_with_arity(*params)
    new *(params + [nil] * (allocate.method(:initialize).arity - params.size))
  end
end


class One
  def initialize a
    [a]
  end
end

class Two
  def initialize a, b
    [a, b]
  end
end

One.new_with_arity 1     #=> [1]
Two.new_with_arity 1, 2  #=> [1, 2]
Two.new_with_arity 1     #=> [1, nil]