【发布时间】:2019-03-28 01:46:40
【问题描述】:
如何用 31 代替年龄?
[{"name"=>"Bob"}, {"age"=>"30"}]
【问题讨论】:
-
如果 Bob 是 30,属性应该在 same 散列中,因为它们代表同一个人:
[{"name"=>"Bob", "age"=>"30"}]
标签: ruby
如何用 31 代替年龄?
[{"name"=>"Bob"}, {"age"=>"30"}]
【问题讨论】:
[{"name"=>"Bob", "age"=>"30"}]
标签: ruby
另一种方式,使用查找
1.9.3p194 :007 > array1 = [{"name"=>"Bob"}, {"age"=>"30"}]
=> [{"name"=>"Bob"}, {"age"=>"30"}]
1.9.3p194 :008 > hash1 = array1.find { |h| h['age'] == "30" }
=> {"age"=>"30"}
1.9.3p194 :009 > hash1['age'] = 31
=> 31
1.9.3p194 :010 > array1
=> [{"name"=>"Bob"}, {"age"=>31}]
【讨论】:
使用地图! (将替换包含它的所有哈希中的年龄值)
a = [{"name"=>"Bob"}, {"age"=>"30"}]
a.map! do |h|
h['age'] = 31 if h['age']
h
end
a
=> [{"name"=>"Bob"}, {"age"=>31}]
【讨论】:
为什么不将数组转换成更容易、更灵活的东西呢?您的数组迫切需要成为一个值对象:
class Person
attr_accessor :name, :age
def initialize arr
arr.each { |h| h.each { |k,v| instance_variable_set("@#{k}", v) } }
end
def to_hash_array
instance_variables.each_with_object([]) do |iv, arr|
arr << {iv.to_s.sub('@','') => instance_variable_get(iv)}
end
end
end
def hash_array_to_person arr
person = Person.new
arr.each { |h| h.each { |k,v| person.send("#{k}=", v) } }
person
end
example = [{"name"=>"Bob"}, {"age"=>"30"}]
bob = Person.new(example)
p bob
p bob.to_hash_array
bob.age = 31
p bob.to_hash_array
输出:
#<Person:0x00000000fe8418 @name="Bob", @age="30">
[{"name"=>"Bob"}, {"age"=>"30"}]
[{"name"=>"Bob"}, {"age"=>31}]
Ruby 不是 C,您可以使用比基本的原始数据类型更多的东西。
【讨论】:
由于您真正拥有的是一个哈希数组,您可以索引该数组以获取第二个哈希,然后通过传递 "age" 作为键来更新值:
1.9.3p194 :001 > h = [{"name"=>"Bob"}, {"age"=>"30"}]
=> [{"name"=>"Bob"}, {"age"=>"30"}]
1.9.3p194 :002 > h[1]["age"] = 31
=> 31
1.9.3p194 :003 > h
=> [{"name"=>"Bob"}, {"age"=>31}]
【讨论】:
这样就可以了:
[{"name"=>"Bob"}, {"age"=>"30"}][1]["age"] = 31
【讨论】: