Command-Line Programs
Flag Parsing
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
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}"
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
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
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
argsstarts as["build", "--verbose"].include?("--verbose")returnstrue.include?("--quiet")returnsfalse.- The
quietbranch is skipped. - The
verbosebranch setsmodetoverbose. | 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.