user3103957
user3103957

Reputation: 848

apply/get methods in Scala

If we go by the definition in "Programming in Scala" book:

When you apply parentheses surrounding one or more values to a variable, Scala will transform the code into an invocation of a method named apply on that variable

Then what about accessing the elements of an array? eg: x(0) is transformed to x.apply(0) ? (let's assume that x is an array). I tried to execute the above line. It was throwing error. I also tried x.get(0) which was also throwing error.

Can anyone please help?

Upvotes: 1

Views: 962

Answers (3)

Alexey Romanov
Alexey Romanov

Reputation: 170735

For

x(1)=200

which you mention in the comment, the answer is different. It also gets translated to a method call, but not to apply; instead it's

x.update(1, 200)

Just like apply, this will work with any type which defines a suitable update method.

Upvotes: 1

prayagupadhyay
prayagupadhyay

Reputation: 31222

() implies apply(),

Array example,

scala> val data = Array(1, 1, 2, 3, 5, 8)
data: Array[Int] = Array(1, 1, 2, 3, 5, 8)

scala> data.apply(0)
res0: Int = 1

scala> data(0)
res1: Int = 1

not releated but alternative is to use safer method which is lift

scala> data.lift(0)
res4: Option[Int] = Some(1)

scala> data.lift(100)
res5: Option[Int] = None

**Note: ** scala.Array can be mutated,

scala> data(0) = 100

scala> data
res7: Array[Int] = Array(100, 1, 2, 3, 5, 8)

In this you can not use apply, think of apply as a getter not mutator,

scala> data.apply(0) = 100
<console>:13: error: missing argument list for method apply in class Array
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `apply _` or `apply(_)` instead of `apply`.
       data.apply(0) = 100
            ^

You better use .update if you want to mutate,

scala> data.update(0, 200)

scala> data
res11: Array[Int] = Array(200, 1, 2, 3, 5, 8)

User defined apply method,

scala>   object Test {
     | 
     |     case class User(name: String, password: String)
     | 
     |     object User {
     |       def apply(): User = User("updupd", "password")
     |     }
     | 
     |   }
defined object Test

scala> Test.User()
res2: Test.User = User(updupd,password)

Upvotes: 2

Sebastian Celestino
Sebastian Celestino

Reputation: 1428

If you add an apply method to an object, you can apply that object (like you can apply functions).

The way to do that it is just apply the object as if it was a function, directly with (), without a "dot".

val array:Array[Int] = Array(1,2,3,4)

array(0) == array.apply(0)

Upvotes: 1

Related Questions