ruby - 在 Ruby 中为 new 使用正确数量的参数

标签 ruby metaprogramming

我正在开发一个可以使用不同版本的 Gherkin 的 gem,但我遇到了一个问题: 在 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 的元数是 -1。 你有想法吗?

最佳答案

我建议听从 Jim Deville 的建议。说这是一个非常有趣的想法,而且你非常接近。问题是没有实例就无法获取方法,所以诀窍是先使用分配。

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]

关于ruby - 在 Ruby 中为 new 使用正确数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8192511/

相关文章:

ruby - 如何在运行时动态创建实例方法?

c++ - 模板结构的静态常量成员的不同值

sql - SQLite3::SQLException:Rails应用没有这样的表

ruby - 否定 RSpec 3 中的参数匹配器

javascript - 为所有数组元素调用函数,而不将 item 作为参数传递

java - 从其泛型类型参数派生的泛型类

ruby - 向 ruby​​ 中的多个类添加方法

java - 生成 Java 代码解析树并对其进行评估以进行测试

regex - 匹配字符串中的 url 路径和 IP 地址

ruby-on-rails - 需要帮助将 youtube_it 集成到我的 Rails 应用程序中