Logical Operators

1. &&, and

只有兩個值皆為 true,才成立。

Ex: true && true => true, false && true => false

2. ||, or

只要有一個值為 true,就成立並回傳該值。

Ex: false || true => true, true || false => true

3. !, not

就是個唱反調的,如果該值為 Truthy,則回傳 false,反之亦然。

Ex: !true => false, !nil => true

Truthy and Fasley value

接續上一篇 Ruby 中的 Truthy, Falsey value,試著回答看看以下的 code 執行會回傳什麼?

str = ""
str || str.length

首先假定我們已經都知道邏輯運算子的用法,且對上一篇還有印象。

Ruby 會是這樣判斷的:

  1. str 空字串是 Truthy value
  2. || 一者為 true,
  3. 既然 str 已為 true
  4. 便直接回傳 str,也就是 ""
str = ""
str && str.length
  1. 前面一樣為 Truthy value
  2. && 二者須為 true
  3. str true,str.length true => 成立
  4. 空字串長度為 0

參考 [這篇][“truthy” and “falsey” (or “falsy”) in Ruby] 的方法,建議進入 irb, 帶入參數自己玩看看,印象會更深刻。

def and_op(a, b)
  a && b
end

def or_op(a, b)
  a || b
end

def not_op(a)
  !a
end

甚至讓回傳的結果更完整可以嘗試看看:

1. &&, and

def print_and_op(a, b)
  return_value = and_op(a, b)
  if return_value
    puts "#{a.inspect} && #{b.inspect} => #{return_value.inspect}, is truthy"
  else
    puts "#{a.inspect} && #{b.inspect} => #{return_value.inspect}, is falsey"
  end
end

print_and_op(nil, true)
=> ?

2. ||, or

def print_or_op(a, b)
  return_value = or_op(a, b)
  if return_value
    puts "#{a.inspect} || #{b.inspect} => #{return_value.inspect}, truthy"
  else
    puts "#{a.inspect} || #{b.inspect} => #{return_value.inspect}, falsey"
  end
end

print_or_op(false, true)
=> ?

3. !, not

def print_not_op(a)
  return_value = not_op(a)
  if return_value
    puts "!#{a.inspect} => #{return_value.inspect}, truthy"
  else
    puts "!#{a.inspect} => #{return_value.inspect}, falsey"
  end
end

print_not_op(0)
=> ?

這是基本中的基本,花一點時間加深印象絕對值得。至少不必像我一樣在面試時回答的支支唔唔,一方面心裡也心虛…共勉之。

Reference