Skip to content

Commit 727b8fc

Browse files
committed
Update timeline for Scala 3 pattern binding behavior changes
These changes are slated to occur with the release of Scala 3.2 (see scala/scala3#14294) and did not happen in 3.1.
1 parent 931ca00 commit 727b8fc

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

_scala3-reference/changed-features/pattern-bindings.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ next-page: /scala3/reference/changed-features/pattern-matching
99
In Scala 2, pattern bindings in `val` definitions and `for` expressions are
1010
loosely typed. Potentially failing matches are still accepted at compile-time,
1111
but may influence the program's runtime behavior.
12-
From Scala 3.1 on, type checking rules will be tightened so that warnings are reported at compile-time instead.
12+
From Scala 3.2 on, type checking rules will be tightened so that warnings are reported at compile-time instead.
1313

1414
## Bindings in Pattern Definitions
1515

@@ -18,7 +18,7 @@ val xs: List[Any] = List(1, 2, 3)
1818
val (x: String) :: _ = xs // error: pattern's type String is more specialized
1919
// than the right-hand side expression's type Any
2020
```
21-
This code gives a compile-time warning in Scala 3.1 (and also in Scala 3.0 under the `-source future` setting) whereas it will fail at runtime with a `ClassCastException` in Scala 2. In Scala 3.1, a pattern binding is only allowed if the pattern is _irrefutable_, that is, if the right-hand side's type conforms to the pattern's type. For instance, the following is OK:
21+
This code gives a compile-time warning in Scala 3.2 (and also earlier Scala 3.x under the `-source future` setting) whereas it will fail at runtime with a `ClassCastException` in Scala 2. In Scala 3.2, a pattern binding is only allowed if the pattern is _irrefutable_, that is, if the right-hand side's type conforms to the pattern's type. For instance, the following is OK:
2222
```scala
2323
val pair = (1, true)
2424
val (x, y) = pair
@@ -28,7 +28,7 @@ want to decompose it like this:
2828
```scala
2929
val first :: rest = elems // error
3030
```
31-
This works in Scala 2. In fact it is a typical use case for Scala 2's rules. But in Scala 3.1 it will give a warning. One can avoid the warning by marking the right-hand side with an `@unchecked` annotation:
31+
This works in Scala 2. In fact it is a typical use case for Scala 2's rules. But in Scala 3.2 it will give a warning. One can avoid the warning by marking the right-hand side with an `@unchecked` annotation:
3232
```scala
3333
val first :: rest = elems: @unchecked // OK
3434
```
@@ -43,7 +43,7 @@ val elems: List[Any] = List((1, 2), "hello", (3, 4))
4343
for (x, y) <- elems yield (y, x) // error: pattern's type (Any, Any) is more specialized
4444
// than the right-hand side expression's type Any
4545
```
46-
This code gives a compile-time warning in Scala 3.1 whereas in Scala 2 the list `elems`
46+
This code gives a compile-time warning in Scala 3.2 whereas in Scala 2 the list `elems`
4747
is filtered to retain only the elements of tuple type that match the pattern `(x, y)`.
4848
The filtering functionality can be obtained in Scala 3 by prefixing the pattern with `case`:
4949
```scala
@@ -59,4 +59,4 @@ Generator ::= [‘case’] Pattern1 ‘<-’ Expr
5959

6060
## Migration
6161

62-
The new syntax is supported in Scala 3.0. However, to enable smooth cross compilation between Scala 2 and Scala 3, the changed behavior and additional type checks are only enabled under the `-source future` setting. They will be enabled by default in version 3.1 of the language.
62+
The new syntax is supported in Scala 3.0. However, to enable smooth cross compilation between Scala 2 and Scala 3, the changed behavior and additional type checks are only enabled under the `-source future` setting. They will be enabled by default in version 3.2 of the language.

0 commit comments

Comments
 (0)