我正在制作一个可以使用不同版本的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。 你有什么想法吗?
答案 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]