A flag is a named switch that changes behavior when it is present.

flag Small command-line tools often check for boolean flags with `include?`.

Flag Parsing

args
flag_parsing.rb
Replay: real traced execution (multi-file project)
args = ["build", "--verbose"]
verbose = args.include?("--verbose")
quiet = args.include?("--quiet")

mode = if quiet
  "quiet"
elsif verbose
  "verbose"
else
  "normal"
end

puts "args=#{args.join(' ')}"
puts "verbose=#{verbose}"
puts "quiet=#{quiet}"
puts "mode=#{mode}"
args = ["build"]
verbose = args.include?("--verbose")
quiet = args.include?("--quiet")

mode = if quiet
  "quiet"
elsif verbose
  "verbose"
else
  "normal"
end

puts "args=#{args.join(' ')}"
puts "verbose=#{verbose}"
puts "quiet=#{quiet}"
puts "mode=#{mode}"
args = ["build", "--quiet", "--verbose"]
verbose = args.include?("--verbose")
quiet = args.include?("--quiet")

mode = if quiet
  "quiet"
elsif verbose
  "verbose"
else
  "normal"
end

puts "args=#{args.join(' ')}"
puts "verbose=#{verbose}"
puts "quiet=#{quiet}"
puts "mode=#{mode}"
  1. args ← ["build", "--verbose"], verbose ← true, quiet ← false, mode ← verbose

    1args→ ["build", "--verbose"] = ["build", "--verbose"]  #@args=["build"], ["build", "--quiet", "--verbose"]2verbose→ true = args.include?("--verbose")true3quiet→ false = args.include?("--quiet")false45mode→ verbose = if quietfalse6  "quiet"7elsif verbosetrue8  "verbose"9else10  "normal"11end1213puts "args=#{args.join(' ')build --verbose}"14puts "verbose=#{verbosetrue}"15puts "quiet=#{quietfalse}"16puts "mode=#{modeverbose}"
    outputargs=build --verbose
    verbose=true
    quiet=false
    mode=verbose
  1. args ← ["build"], verbose ← false, quiet ← false, mode ← normal

    1args→ ["build"] = ["build"]2verbose→ false = args.include?("--verbose")false3quiet→ false = args.include?("--quiet")false45mode→ normal = if quietfalse6  "quiet"7elsif verbosefalse8  "verbose"9else10  "normal"11end1213puts "args=#{args.join(' ')build}"14puts "verbose=#{verbosefalse}"15puts "quiet=#{quietfalse}"16puts "mode=#{modenormal}"
    outputargs=build
    verbose=false
    quiet=false
    mode=normal
  1. args ← ["build", "--quiet", "--verbose"], verbose ← true, quiet ← true

    1args→ ["build", "--quiet", "--verbose"] = ["build", "--quiet", "--verbose"]2verbose→ true = args.include?("--verbose")true3quiet→ true = args.include?("--quiet")true45mode→ quiet = if quiettrue6  "quiet"7elsif verbosetrue8  "verbose"9else10  "normal"11end1213puts "args=#{args.join(' ')build --quiet --verbose}"14puts "verbose=#{verbosetrue}"15puts "quiet=#{quiettrue}"16puts "mode=#{modequiet}"
    outputargs=build --quiet --verbose
    verbose=true
    quiet=true
    mode=quiet

Follow the Flags

  1. args starts as ["build", "--verbose"].
  2. include?("--verbose") returns true.
  3. include?("--quiet") returns false.
  4. The quiet branch is skipped.
  5. The verbose branch sets mode to verbose. | args | verbose | quiet | mode | | --- | --- | --- | --- | | build | false | false | normal | | build --verbose | true | false | verbose | | build --quiet --verbose | true | true | quiet |

Exercise: flag_parsing.rb

Reproduce args=build --verbose, verbose=true, quiet=false, and mode=verbose, then use the pinned build-only and quiet-plus-verbose arguments to predict normal and quiet modes.