【问题标题】:Why does output of & operator with any logic operation doesn't give any output in Ruby?为什么&运算符的输出与任何逻辑运算都不会在Ruby中给出任何输出?
【发布时间】:2021-05-28 17:12:00
【问题描述】:
puts "Hello World"

scores = {"biology" => ['unit_test','final_exam'],
  "maths" => ['quiz','class_participation','final_exam']
}

x =  (scores["biology"] & %w[flying_test])

puts "result of x && scores[\"biology\"].any? => #{x && scores["biology"].any?}"# Why does this return true? 

y = scores["maths"] & %w[quiz]
z = scores["maths"].any?
puts "result of scores[\"maths\"] & %w[quiz] => #{y}" # returns true
puts "result of scores[\"maths\"].any? => #{z}" # return true
puts "result of y && z => #{y && z}"

puts "******"
puts "Clubbing all conditions, returns no output, why? it is actually evluates to (true || true), right"
puts ( (scores["biology"].any? && (scores["biology"] & %w[flying_test])) ||
       (scores["maths"].any? && (scores["maths"] & %w[quiz])) )


# But when above two sub-conditions are swapped puts print the value as true
puts "$$$$$$$"
puts ((scores["biology"] & %w[flying_test]) && scores["biology"].any?) ||
((scores["maths"] & %w[quiz]) && scores["maths"].any?)


puts "cross check"
# puts (1 == 1).any?

https://onlinegdb.com/YBmzutZOj - 你可以在这里执行

【问题讨论】:

  • 注意&& 运算符(布尔与)和& 运算符(在这种情况下设置交集)之间的区别。
  • && 在 Ruby 中不返回 true/false,它返回最后评估的值。 a && b 包含表达式 a 和表达式 ba 总是被评估。如果a 的计算结果为假值(nilfalse),则表达式短路并返回a 的结果。如果a 的计算结果为真值(不是falsenil),则计算表达式b 并返回b 的结果。以下是一些示例:true && true #=> truetrue && 1 #=> 11 && 'Hello World!' #=> "Hello World!"false && 1 #=> falsenil && 1 #=> nil2 && nil #=> nil

标签: ruby-on-rails ruby bitwise-operators


【解决方案1】:

你实际上想用你的“&”做什么?

简化示例:

puts ( scores["biology"] & %w[flying_test] )

您是否尝试检查该对象是否存在,并且只返回该对象,ala:

if scores["biology"].include?('flying_test')

或者您是否尝试添加:

scores["biology"] + %w[flying_test]

如果没有分数,或者返回您的列表?

scores["biology"] || %w[flying_test]

...

或者您是否希望将“&”作为返回内容测试的一部分:

puts (scores['biology'].any? && scores['biology'].include?('flying_test') && %w[flying_test]) ||
     (scores['maths'].any? && scores['maths'].include?('quiz') && %w[quiz])

或者可能,更像(更接近您的编码风格):

puts (scores["biology"] & %w[flying_test]).any? && (scores["biology"] & %w[flying_test]) ||
      scores["maths"] & %w[quiz]

?

【讨论】:

  • 只是给投反对票的人的便条,目前的问题尚不清楚。我已经提出了几个解决方案,实际上可以做到他想要做的,但是我相信最后一个是他真正想要做的。
【解决方案2】:

&& 返回第二个操作数,如果两个操作数都是truthy,并且在ruby 中,空列表是truthy

在您的特定情况下,x = (scores["biology"] & %w[flying_test]) 计算为空列表 [],因此 x && scores["biology"].any? 实际上计算为 [] && true,因此 true

另外,在

puts ( (scores["biology"].any? && (scores["biology"] & %w[flying_test])) ||
       (scores["maths"].any? && (scores["maths"] & %w[quiz])) )

第一个操作数的计算结果也为空列表,因此整个|| 操作的计算结果为空列表[]。执行puts [] 会导致不生成任何输出。

【讨论】:

  • 虽然我同意答案,但我觉得 “第一个操作数也计算为空列表” 可以使用一些额外的解释,因为 OP 似乎认为 @ 987654334@ 返回truefalse。只需添加评估步骤可能会使事情更清楚。 scores["biology"].any? && (scores["biology"] & %w[flying_test]) -> true && [] -> []
猜你喜欢
  • 1970-01-01
  • 2020-09-29
  • 2014-03-21
  • 1970-01-01
  • 2017-07-28
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
相关资源
最近更新 更多