|
1 | 1 | ---
|
2 | 2 | title: Context Bounds
|
3 | 3 | type: section
|
4 |
| -description: This page demonstrates Context Bounds in Scala 3. |
| 4 | +description: This page demonstrates Context Bounds in Scala. |
5 | 5 | languages: [zh-cn]
|
6 | 6 | num: 61
|
7 | 7 | previous-page: ca-given-using-clauses
|
8 | 8 | next-page: ca-given-imports
|
9 | 9 | ---
|
10 |
| -<span class="tag tag-inline">Scala 3 only</span> |
11 | 10 |
|
12 |
| - |
13 |
| -{% comment %} |
14 |
| -- TODO: define "context parameter" |
15 |
| -- TODO: define "synthesized" and "synthesized arguments" |
16 |
| -{% endcomment %} |
17 |
| - |
18 |
| -In many situations the name of a _context parameter_ doesn’t have to be mentioned explicitly, since it’s only used by the compiler in synthesized arguments for other context parameters. |
| 11 | +In many situations the name of a [context parameter]({% link _overviews/scala3-book/ca-given-using-clauses.md %}#using-clauses) doesn’t have to be mentioned explicitly, since it’s only used by the compiler in synthesized arguments for other context parameters. |
19 | 12 | In that case you don’t have to define a parameter name, and can just provide the parameter type.
|
20 | 13 |
|
21 | 14 |
|
22 | 15 | ## Background
|
23 | 16 |
|
24 | 17 | For example, this `maximum` method takes a _context parameter_ of type `Ord`, only to pass it on as an argument to `max`:
|
25 | 18 |
|
26 |
| -{% tabs context-bounds-max-named-param %} |
27 |
| - |
28 |
| -{% tab 'Scala 3 Only' %} |
| 19 | +{% tabs context-bounds-max-named-param class=tabs-scala-version %} |
29 | 20 |
|
| 21 | +{% tab 'Scala 2' %} |
30 | 22 | ```scala
|
31 |
| -def maximum[A](xs: List[A])(using ord: Ord[A]): A = |
| 23 | +def maximum[A](xs: List[A])(implicit ord: Ord[A]): A = |
32 | 24 | xs.reduceLeft(max(ord))
|
33 | 25 | ```
|
34 |
| - |
35 | 26 | {% endtab %}
|
36 | 27 |
|
37 |
| -{% endtabs %} |
38 |
| - |
39 |
| -In that code the parameter name `ord` isn’t actually required; it can be passed on as an inferred argument to `max`, so you just state that `maximum` uses the type `Ord[A]` without giving it a name: |
40 |
| - |
41 |
| -{% tabs context-bounds-no-param-name %} |
42 |
| - |
43 |
| -{% tab 'Scala 3 Only' %} |
44 |
| - |
| 28 | +{% tab 'Scala 3' %} |
45 | 29 | ```scala
|
46 |
| -def maximum[A](xs: List[A])(using Ord[A]): A = |
47 |
| - xs.reduceLeft(max) |
| 30 | +def maximum[A](xs: List[A])(using ord: Ord[A]): A = |
| 31 | + xs.reduceLeft(max(using ord)) |
48 | 32 | ```
|
49 |
| - |
50 | 33 | {% endtab %}
|
51 | 34 |
|
52 | 35 | {% endtabs %}
|
53 | 36 |
|
54 |
| - |
55 | 37 | ## Context bounds
|
56 | 38 |
|
57 |
| -Given that background, a _context bound_ is a shorthand syntax for expressing the pattern of, “a context parameter that depends on a type parameter.” |
| 39 | +Given that background, a _context bound_ is a shorthand syntax for expressing the pattern of, “a context parameter applied to a type parameter.” |
58 | 40 |
|
59 | 41 | Using a context bound, the `maximum` method can be written like this:
|
60 | 42 |
|
61 | 43 | {% tabs context-bounds-max-rewritten %}
|
62 | 44 |
|
63 |
| -{% tab 'Scala 3 Only' %} |
| 45 | +{% tab 'Scala 2 and 3' %} |
64 | 46 |
|
65 | 47 | ```scala
|
66 |
| -def maximum[A: Ord](xs: List[A]): A = xs.reduceLeft(max) |
| 48 | +def maximum[A: Ord](xs: List[A]): A = |
| 49 | + xs.reduceLeft(max) |
67 | 50 | ```
|
68 | 51 |
|
69 | 52 | {% endtab %}
|
70 | 53 |
|
71 | 54 | {% endtabs %}
|
72 | 55 |
|
73 | 56 |
|
74 |
| -A bound like `: Ord` on a type parameter `A` of a method or class indicates a context parameter with `Ord[A]`. |
| 57 | +A bound like `: Ord` on a type parameter `A` of a method or class indicates a context parameter with type `Ord[A]`. |
| 58 | +Under the hood, the compiler transforms this syntax into the one shown in the Background section. |
75 | 59 |
|
76 |
| -For more information about context bounds, see the [“What are context bounds?”](https://docs.scala-lang.org/tutorials/FAQ/context-bounds.html) section of the Scala FAQ. |
| 60 | +For more information about context bounds, see the [“What are context bounds?”]({% link _overviews/FAQ/index.md %}#what-are-context-bounds) section of the Scala FAQ. |
0 commit comments