I have come to an idea that in order to create a prefix method for an object, I could use :
at te end of the method name, hence, I wrote:
def aaa: {
}
and it compiles just fine! However, this is of no use, so I want to make the method return something, so, uncertain, I write:
def aaa: = {
}
error!
- identifier expected but '=' found.
- not found: type <error>
Ok, I understand that the compiler breaks at : =
, I become curious and I try:
def aaa: {
println("wow")
}
error again!
illegal start of declaration (possible cause: missing `=' in front of current method body)
Then I try this:
val a = aaa
and it says (hovering over aaa
) that aaa
signature is def aaa: AnyRef
, so I try:
def aaa: {
Global
}
where Global
is an object
. Still error. So, my question is: why this syntax is allowed? I can't make it work like a prefix method, I can't use this method for side-effects and I can't make it return anything. Why does it allow me to write like this in the first place?
UPDATE:
now I try this:
def aaa: {} = {
Global
}
and it works. So looks like that {}
denotes AnyRef
. Starts feeling like I am in the JavaScript wonderland.
You get these error, because a colon at the end of a method name means, that you'd like to specify a return type. If you then don't give one, the compiler complains. With {}
it works, because you give a type, in this case an empty structural type, which is basically the same as AnyRef
. There are rules, when you are actually allowed to add a colon at the end of a method name, afaik the method can only consist of non-alphanumeric characters. So def +:(x:Int)
is ok, def foo:(x:Int)
leads to an error. But I'm not quiet sure about that. Also methods that end with a colon are right-associative.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With