Ruby散列键作为对象方法

时间:2017-09-22 13:29:42

标签: ruby-on-rails ruby

是否存在API或如何创建可通过点(。)方法访问的哈希键,如果存在对象数组。

以下是一个例子:

HTML

如果我尝试这样做:

data = [
  {
    key1: 'value1',
    key2: 'value2'
  },
  {
    key1: 'valuex',
    key2: 'valuey'
  },
  ...
]

会收到此错误:

data.collect(&:key1)

然而这有效:

NoMethodError: undefined method `key1' for #<Hash:0x007fc2a7159188>

仅仅因为它是一个符号而不是对象属性。有没有一种方法可以用符号完成相同的行为,就好像它们是对象属性一样?

3 个答案:

答案 0 :(得分:0)

您可以使用OpenStruct

包装对象
require 'ostruct'

data.map { |it| OpenStruct.new(it) }.collect(&:key1)

答案 1 :(得分:0)

您可以将这些哈希值包装到OpenStruct中。尝试使用此代码:

data.map! { |hsh| OpenStruct.new(hsh) }

data.first.key1 # => "value1"

答案 2 :(得分:0)

这是受@ spickerman评论的启发。这是人们可以做的事情,但可能不应该这样做。

您可以将自定义方法添加到Ruby的Enumerable模块中:

module Enumerable
  def enum_send(:method, *args)
    send(:method) { |obj| obj.send(*args) }
  end
end

然后你可以打电话

data.enum_send(:collect, :"[]", :key1)  ## [value1, valuex..]

或类似

data.enum_send(:each, :delete, :key2)  ## [{key1: value1}, {key1: valuex}..]