Ruby 1.8.7 Array of symbols raising TypeError: Symbol as array index

Ruby 1.8.7 Array of symbols raising TypeError: Symbol as array index

我最近创建了一个 pull request for a gem,它是在 travis 的基础上针对相当旧的 ruby 版本构建的,以实现向后兼容性。

在我的提交中,我想在一些作为散列参数传递的方法选项上引入白名单。

在 Rails 中,最近的 ruby 版本看起来像:

MY_WHITELIST = %i(a b c)
def my_method(options={})
  @options = options.slice(*MY_WHITELIST)
end

为了在独立 gem 中实现向后兼容性,我提供了如下解决方案:

MY_WHITELIST = [:a, :b, :c]
def my_method(options={})
  @options = options.select { |k, _| MY_WHITELIST.include?(k) }
end

此 ruby 1.9.3 通过,但 1.8.7 引发以下异常:

TypeError: Symbol as array index

根据documentation,这种初始化数组的方式应该被接受。

您有使用经验吗?你有什么建议?

正如@mr_sudaca 的评论中所建议的那样,解决方案是在数组上进行选择:

Hash[options.to_a.select { |k, _| MY_WHITELIST.include?(k) }]