Что такое идиоматический способ Ruby для объединения двух хешей логических значений в логических операциях? - PullRequest
0 голосов
/ 01 июня 2018

Вот цель:

a={a:true, b:true, c:true, d:false, e:false, g:false, h:nil,  i:nil, j:nil}
b={a:true, b:false, c:nil, d:true,  e:false, g:nil,   h:true, i:false, j:nil}
c={a:true, b:false, c:nil, d:false, e:false, g:nil,   h:nil,  i:nil, j:nil}
conjonctive_map(a, b) == c # expect to be true

Итак, вопрос в том, каков идиоматический способ добиться этого в Ruby?Это не обязательно должен быть conjonctive_map определенный метод, встроенный .map или что-то в этом роде.Кроме того, в моем случае было бы неплохо иметь любую операцию, которая подразумевает nil для возврата false, я предложил c, который всегда заканчивается nil.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018
a = { a:true,  b:true, c:true, d:false, e:false, g:false, h:nil,  i:nil,   j:nil }
b = { b:false, a:true, c:nil,  d:true,  e:false, g:nil,   h:true, i:false, j:nil }

values = b.values_at(*a.keys)
  #=> [true, false, nil, true, false, nil, true, false, nil]
a.transform_values { |v| v && values.shift }
  #=> {:a=>true, :b=>false, :c=>nil, :d=>false, :e=>false, :g=>false, :h=>nil,
  #    :i=>nil, :j=>nil}

См. Hash # transform_values ​​, который дебютировал в Ruby v2.4.

Если должны быть возвращены только true и false, замените &&с &.См. TrueClass # & , FalseClass # & и NilClass # & .

0 голосов
/ 01 июня 2018
a={a:true, b:true, c:true, d:false, e:false, g:false, h:nil,  i:nil, j:nil}
b={a:true, b:false, c:nil, d:true,  e:false, g:nil,   h:true, i:false, j:nil}
a.merge(b) { |_, v1, v2| v1 && v2 }
#⇒ {:a=>true, :b=>false, :c=>nil, :d=>false,
#   :e=>false, :g=>false, :h=>nil, :i=>nil, :j=>nil}

Если по какой-то причине вы хотите, чтобы nil преобладал над false, это нужно сделать явно:

c={a:true, b:false, c:nil, d:false, e:false, g:nil,   h:nil,  i:nil, j:nil}
a.merge(b) { |_, v1, v2| [v1, v2].any?(&:nil?) ? nil : v1 && v2 }
_ == c
#⇒ true
...