4

Right now I have a def that returns a Tuple2[String, Int], or (String, Int).

def makeTuple(name: String, age: Int) : (String, Int) = {
  (name, age)
}
val nameAge = makeTuple("test", 12)
println(nameAge._1) // prints test
println(nameAge._2) // prints 12

Ok this works, but Is there a way to give this tuple names?

For example:

println(nameAge.name)
println(nameage.age)
Mr.Turtle
  • 2,950
  • 6
  • 28
  • 46
  • 5
    You can destructure on the LHS of the val definition: `val (name, age) = makeTuple("test", 12)`. Otherwise, if you want named accessors, define a custom case class. – jub0bs Oct 18 '18 at 08:02
  • @jubobs Thanks! It works. Add it to an answer and I'll accept it. – Mr.Turtle Oct 18 '18 at 08:09

3 Answers3

3

As jubobs mentioned we can do it like this:

Using the case class:

 case class NameAge(name:(String), age:(Int))

  def makeTuple(name: String, age:Int): NameAge = {
    NameAge(name, age)
  }

  val nameAge = makeTuple("test",12)
  println(nameAge.name, nameAge.age)

Using val:

  def makeTuple1(name: String, age:Int): (String, Int) = {
    (name, age)
  }

  val (name, age) = makeTuple1("test", 12)
  println(name, age)
Raman Mishra
  • 2,635
  • 2
  • 15
  • 32
3

Note that case classes can be defined locally, so they don't pollute the namespace and can be close to where you use them:

def f() = {
  ...
  case class NameAge(name: String, age: Int)
  val nameAge = NameAge("test", 12)
  println(nameAge.name)
  println(nameAge.age)
  ...
}

Alternately, you could use a library like Scala Records:

val nameAge = Rec("name" -> "test", "age" -> 12)
println(nameAge.name)
println(nameAge.age)
Alexey Romanov
  • 167,066
  • 35
  • 309
  • 487
3

You can just assign both names to the output of your function:

val (name, age) = makeTuple("test", 12)

Or even get rid of the function

val (name, age) = ("test", 12)

Then (in both cases) you can perform your prints as follows:

println(name)
println(age)
SCouto
  • 7,808
  • 5
  • 32
  • 49