Ruby uses true, false, and nil to model yes/no and missing values.

nil `nil` represents no value. A comparison such as `value.nil?` returns a boolean.

Booleans and Nil

logged_in
booleans_nil.rb
Replay: real traced execution (multi-file project)
logged_in = true
nickname = nil
status = logged_in ? "active" : "guest"
has_nickname = !nickname.nil?

puts "status=#{status}"
puts "has_nickname=#{has_nickname}"
logged_in = false
nickname = nil
status = logged_in ? "active" : "guest"
has_nickname = !nickname.nil?

puts "status=#{status}"
puts "has_nickname=#{has_nickname}"
  1. logged_in ← true, nickname ← (empty), status ← active, has_nickname ← false

    1logged_in→ true = true  #@logged_in=false2nickname→ (empty) = nil3status→ active = logged_intrue ? "active" : "guest"4has_nickname→ false = !nickname.nil?true56puts "status=#{statusactive}"7puts "has_nickname=#{has_nicknamefalse}"
    outputstatus=active
    has_nickname=false
  1. logged_in ← false, nickname ← (empty), status ← guest, has_nickname ← false

    1logged_in→ false = false2nickname→ (empty) = nil3status→ guest = logged_infalse ? "active" : "guest"4has_nickname→ false = !nickname.nil?true56puts "status=#{statusguest}"7puts "has_nickname=#{has_nicknamefalse}"
    outputstatus=guest
    has_nickname=false

Follow the Values

  1. logged_in starts as true.
  2. nickname starts as nil.
  3. The ternary chooses "active" because logged_in is true.
  4. !nickname.nil? becomes false because the nickname is missing.
  5. The program prints status=active and has_nickname=false. | logged_in | nickname | status | has_nickname | | --- | --- | --- | --- | | true | nil | active | false | | false | nil | guest | false |

Exercise: booleans_nil.rb

Reproduce status=active and has_nickname=false, then use the pinned logged_in=false value to predict the status.