Ruby中数组到对象的复杂映射

时间:2009-08-17 12:20:27

标签: ruby functional-programming map

我有一个字符串数组:

["username", "String", "password", "String"]

我想将此数组转换为Field对象列表:

class Field
    attr_reader :name, :type
    def initialize(name, type)
        @name = name
        @type = type
    end
end

所以我需要映射“username”,“String”=> Field.new(“用户名”,“字符串”)等。数组的长度始终是2的倍数。

有人知道这是否可以使用地图样式方法调用?

3 个答案:

答案 0 :(得分:4)

括号中的Hash调用完全符合您的需要。给定

a = ["username", "String", "password", "String"]

然后:

fields = Hash[*a].map { |name, type| Field.new name, type }

答案 1 :(得分:2)

看看each_slice。它应该做你需要的。

答案 2 :(得分:2)

1.8.6:

require 'enumerator'
result = []
arr = ["username", "String", "password", "String"]
arr.each_slice(2) {|name, type| result << Field.new(name, type) }

或Magnar的解决方案有点短。

对于1.8.7+,您可以这样做:

arr.each_slice(2).map {|name, type| Field.new(name, type) }