Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby惯用的在布尔运算上合并两个布尔值散列的方法是什么?_Ruby_Boolean Operations - Fatal编程技术网

Ruby惯用的在布尔运算上合并两个布尔值散列的方法是什么?

Ruby惯用的在布尔运算上合并两个布尔值散列的方法是什么?,ruby,boolean-operations,Ruby,Boolean Operations,目标如下: 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_ma

目标如下:

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中实现这一点的惯用方法是什么?它不一定是一个
conconconconctive\u-map
定义的方法,一个内联
.map
或类似的方法。在我的例子中,让任何包含
nil
的操作返回
false
也可以,我提出了一个
c
,它总是以
nil
结束

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
如果出于某种原因,您希望
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
参见,它在Ruby v2.4中首次亮相

如果只返回
true
false
,则用
&
替换
&
。看,还有

参见,它在Ruby v2.4中首次亮相


如果只返回
true
false
,则用
&
替换
&
。看,和。

我想知道为什么
a.each{k,v|a[k]&&b[k]}==c
不起作用。因为
Enumerable#each
返回接收者。这里最大的谜团是:为什么没有键
:f
?我想知道为什么
a.each{k,v | a[k]&&b[k]}==c
。因为
Enumerable#每个
都返回接收者。这里最大的谜团是:为什么没有键
:f
?很好,而且比我当时得到的要好得多:
a.map{k,v{k=>(a[k]&b[k])}。reduce(:merge)
。我不知道合并可能需要一个街区。我还意识到,实际上
&
是不可交换的:
(false&&nil)=(nil&&false)#false
。你也可以将三元a修饰符改为
a.merge(b){| |,*v | v.reduce(:&)除非v.any(&:nil?}
@enginersmnky,在这种情况下,当结果必须显式设置为
nil
。@Psycholave当然不是可交换的,为什么你曾期望它会是可交换的?@mudasobwa我并不反对你的结论,即你的结果更易于阅读和理解。(老实说,我只是想不出任何其他的改进来保证一个新的答案)很好,而且比我当时得到的要好得多:
a.map{k,v{k=>(a[k]&b[k])}.reduce(:merge)
。我不知道合并可能需要一个街区。我还意识到,实际上
&
是不可交换的:
(false&&nil)=(nil&&false)#false
。你也可以将三元a修饰符改为
a.merge(b){| |,*v | v.reduce(:&)除非v.any(&:nil?}
@enginersmnky,在这种情况下,当结果必须显式设置为
nil
。@Psycholave当然不是可交换的,为什么你曾期望它会是可交换的?@mudasobwa我并不反对你的结论,即你的结果更易于阅读和理解。(老实说,我就是想不出任何其他的改进来保证一个新的答案)