Return values from branches and blocks.

expression-blocks In Scala, many control structures are expressions. They can calculate a value and assign it to a name.

Expression Blocks

score
ExpressionBlocks.scala
Replay: real traced execution (multi-file project)
object Main {
  def main(args: Array[String]): Unit = {
    val score = 75
    val label = if (score >= 60) "pass" else "retry"
    val bonus = 5
    val adjusted = {
      score + bonus
    }

    println("score=" + score)
    println("label=" + label)
    println("adjusted=" + adjusted)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val score = 45
    val label = if (score >= 60) "pass" else "retry"
    val bonus = 5
    val adjusted = {
      score + bonus
    }

    println("score=" + score)
    println("label=" + label)
    println("adjusted=" + adjusted)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val score = 90
    val label = if (score >= 60) "pass" else "retry"
    val bonus = 5
    val adjusted = {
      score + bonus
    }

    println("score=" + score)
    println("label=" + label)
    println("adjusted=" + adjusted)
  }
}
  1. score ← 75, label ← pass, bonus ← 5, adjusted ← 80

    1object Main {2  def main(args: Array[String]): Unit = {3    val score→ 75 = 75 //@score=45, 904    val label→ pass = if (score75 >= 60) "pass" else "retry"5    val bonus→ 5 = 56    val adjusted→ 80 = {7      score75 + bonus58    }910    println("score=" + score75)11    println("label=" + labelpass)12    println("adjusted=" + adjusted80)13  }14}
    outputscore=75
    label=pass
    adjusted=80
  1. score ← 45, label ← retry, bonus ← 5, adjusted ← 50

    1object Main {2  def main(args: Array[String]): Unit = {3    val score→ 45 = 454    val label→ retry = if (score45 >= 60) "pass" else "retry"5    val bonus→ 5 = 56    val adjusted→ 50 = {7      score45 + bonus58    }910    println("score=" + score45)11    println("label=" + labelretry)12    println("adjusted=" + adjusted50)13  }14}
    outputscore=45
    label=retry
    adjusted=50
  1. score ← 90, label ← pass, bonus ← 5, adjusted ← 95

    1object Main {2  def main(args: Array[String]): Unit = {3    val score→ 90 = 904    val label→ pass = if (score90 >= 60) "pass" else "retry"5    val bonus→ 5 = 56    val adjusted→ 95 = {7      score90 + bonus58    }910    println("score=" + score90)11    println("label=" + labelpass)12    println("adjusted=" + adjusted95)13  }14}
    outputscore=90
    label=pass
    adjusted=95

Follow the Expression

  1. score starts at 75.
  2. The branch checks whether score >= 60.
  3. 75 passes, so label becomes pass.
  4. bonus is 5.
  5. adjusted becomes 80, and the program prints adjusted=80. | score | label | adjusted | | --- | --- | --- | | 45 | retry | 50 | | 75 | pass | 80 | | 90 | pass | 95 |

Exercise: ExpressionBlocks.scala

Reproduce label=pass and adjusted=80, then use scores 45 and 90 to predict each row.