|
| 1 | +--- |
| 2 | +layout: doc-page |
| 3 | +title: "Creator Applications" |
| 4 | +--- |
| 5 | + |
| 6 | +Creator applications allow to use simple function call syntax to create instances |
| 7 | +of a class, even if there is no apply method implemented. Example: |
| 8 | +```scala |
| 9 | +class StringBuilder(s: String) { |
| 10 | + def this() = this(s) |
| 11 | +} |
| 12 | + |
| 13 | +StringBuilder("abc") // same as new StringBuilder("abc") |
| 14 | +StringBuilder() // same as new StringBuilder() |
| 15 | +``` |
| 16 | +Creator applications generalize a functionality provided so far only for case classes, but the mechanism how this is achieved is different. Instead generating an apply method, the compiler adds a new possible interpretation to a function call `f(args)`. The previous rules are: |
| 17 | + |
| 18 | +Given a function call `f(args)`, |
| 19 | + |
| 20 | + - if `f` is a method applicable to `args`, typecheck `f(args)` unchanged, |
| 21 | + - otherwise, if `f` has an `apply` method applicable to `args` as a member, continue with `f.apply(args)`, |
| 22 | + - otherwise, if `f` is of the form `p.m` and there is an implicit conversion `c` applicable to `p` so that `c(p).m` is applicable to `args`, continue with `c(p).m(args)` |
| 23 | + |
| 24 | +There's now a fourth rule following these rules: |
| 25 | + |
| 26 | + - otherwise, if `f` is syntactically a stable identifier, and `new f` where `f` is interpreted as a type identifier is applicable to `args`, continue with `new f(args)`. |
| 27 | + |
| 28 | + Analogously, the possible interpretations of a function call with type arguments `f[targs]` are augmented with the following interpretation as a final fallback: |
| 29 | + |
| 30 | + - if `f` is syntactically a stable identifier, and `new f[targs]` where `f` is interpreted as a type identifier is well-typed, continue with `new f[targs]`. |
| 31 | + |
| 32 | +### Motivation |
| 33 | + |
| 34 | +Leaving out `new` hides an implementation detail and makes code more pleasant to read. Even though it requires a new rule, it will likely increase the perceived regularity of the language, since case classes already provide function call creation syntax (and are often defined for this reason alone). |
| 35 | + |
| 36 | +### Discussion |
| 37 | + |
| 38 | +An alternative design would auto-generate `apply` methods for normal classes, in the same way it is done now for case classes. This design was tried but abandoned since it |
| 39 | +caused numerous problems, including |
| 40 | + |
| 41 | + - overloading ambiguities |
| 42 | + - overriding errors |
| 43 | + - shadowing of user-defined `apply` methods by more specific auto-generated ones. |
0 commit comments