0

Hi I am studying the scala language and have a question. I am reading a book and one of the example says that 0 to 2 is same as (0).to(2). How can I interpret this syntax?? I mean, I can see that to is a function that takes one integer value as its parameter. But what is "(0)." part?? Thanks

2 Answers 2

5

In scala any method taking a single parameter can be written with infix syntax.

So for instance if you have

class Foo(x: Int) {
   def add(y: Int) = x + y
}
val a = new Foo(42)

then these two method calls are exactly equivalent

a.add(4) // 46
a add 4  // 46

The reason why there's a parenthesis around the 0 is that in older versions of scala the 0. would have been interpreted as a floating point number, due to the ambiguous value of . (which can be both a decimal separator and a method selector). Since scala 2.11 (or 2.10, I don't remember), this has been fixed, so you can now safely type

0.+(2) // Int: 2

and get an Int back, whereas you would have had a Float in the past, as the compiler would have seen it as

0.0 + (2) // Float: 2
Sign up to request clarification or add additional context in comments.

4 Comments

In addition, integers and other primitive types are automatically converted to their equivalent object types. The value 0 is an integer and is automatically converted to Int. Int has a method to() which takes one integer argument.
@Bob, it's more the other way around. Int is an object type, which is then represented with a primitive in the underlying JVM.
deprecation in 2.10, new behavior in 2.11. The diff is in val i = 0.; which used to be a double but now an error.
@BobDalgleish There's a special implicit Predef.intWrapper to turn Int into a runtime.RichInt, which is different from boxing to Integer.
0

I mean, I can see that to is a function that takes one integer value as its parameter.

No, it's not a function, it's a method.

Methods are invoked by sending a message to an object:

foo.bar(baz)

This means "send the message bar with the object referenced by baz as argument to the object referenced by foo. This will in turn cause the method bar in foo's class or one of its ancestors to be invoked.

So, to is the message, 2 is the argument, and 0 is the receiver of the message.

Scala allows you to use either a . or whitespace for message sending:

foo bar(baz)
// is the same as
foo.bar(baz)

Also, when using whitespace for message sending, you can leave off the parentheses of the last argument list if it has only a single argument:

foo bar baz
// is the same as
foo bar(baz)

And lastly, parentheses are not only used for argument lists, they are also used for grouping. (And tuple literals as well.) You can always surround an expression with parentheses to clarify its precedence:

(foo).bar(baz)
// is the same as
foo.bar(baz)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.