Как я понимаю, ваш вопрос похож на следующий.
class C
attr_reader :name, :is_k1, :k1, :k2, :v
def initialize(name, is_k1, k1, k2, v)
@name, @is_k1, @k1, @k2, @v = name, is_k1, k1, k2, v
end
end
c1 = C.new("Bob", true, :a, :b, 1)
#=> #<C:0x0000583742602eb8 @name="Bob", @is_k1=true, @k1=:a,
# @k2=:b, @v=1>
c2 = C.new("Lois", false, :c, :d, 2)
#=> #<C:0x0000583742612ac0 @name="Lois", @is_k1=false, @k1=:c,
# @k2=:d, @v=2>
Мы хотим отобразить каждый экземпляр i
( c1
или c2
) в га sh:
{ name: i.name, i.k1: i.v }
, если i.is_k1 #=> true
, и в га sh
{ name: i.name, i.k2: i.v }
, если i.is_k1 #=> false
. Мы могли бы просто написать:
[c1, c2].map { |i| { name: i.name, (i.is_k1 ? i.k1 : i.k2)=>i.v } }
#=> [{:name=>"Bob", :a=>1}, {:name=>"Lois", :d=>2}]