0

我正在为某些代码包升级 Ruby 和 Rails 版本。

我有以下代码块,它在 0 (expected array) 处给我错误元素类型 nil 的错误。

def some_method(var1)
    address_to_field_mapping = { 'name' => 'name'
      'countryCode' => 'countryCode'
    }
# following line errors:
    fields = Hash[address_to_field_mapping.collect{|k,v| [v, var1[k]] unless var1[k].nil?}]
    return {'fields' => fields}
  end

我对 Ruby/Rails 完全不熟悉,有人可以解释突出显示的行是什么意思,以及实际导致此错误的原因是什么?fields = Hash[address_to_field_mapping.collect{|k,v| [v, var1[k]] unless var1[k].nil?}]

4

1 回答 1

0

这看起来像是一种极其复杂的写作方式:

def some_method(var1)
  { 'fields' => var1.slice('name', 'countryCode').compact }
end

如果它们不为零,这将返回包含'name'and字段的哈希。'countryCode'或者至少如果它没有被破坏的话。

我猜写它的人不知道 Ruby(由不必要的回报暗示)但非常关心工作保障。

所以让我们分解一下:

address_to_field_mapping.collect{|k,v| [v, var1[k]] unless var1[k].nil?}

Hash#collect是 map 的别名,遍历数组的键和值,并返回一个由块的返回值组成的数组。这里的返回值是对数组['name', 'bob']或 nil。后一部分是它上升的地方。

Hash[]是一个特殊的哈希构造函数,它接受一个对数组:

irb(main):001:0> Hash[[[foo: 1], [bar: 2], [baz: 3] ]]
=> {{:foo=>1}=>nil, {:bar=>2}=>nil, {:baz=>3}=>nil}

但是如果你把a扔进nil去,它就会爆炸。

irb(main):002:0> Hash[[[foo: 1], [bar: 2], nil ]]
(irb):2:in `[]': wrong element type nil at 2 (expected array) (ArgumentError)  

可以通过使用.compact删除 nil 来修复:

def some_method(var1)
  address_to_field_mapping = { 'name' => 'name'
      'countryCode' => 'countryCode'
  }
  fields = Hash[address_to_field_mapping.collect{|k,v| [v, var1[k]] unless var1[k].nil?}.compact]
  {'fields' => fields}
end
于 2021-11-14T17:41:00.370 回答