【问题标题】:Name tuple variables in Scala在 Scala 中命名元组变量
【发布时间】:2018-10-18 07:58:58
【问题描述】:

现在我有一个def,它返回一个 Tuple2[String, Int] 或 (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

好的,但是有没有办法给这个元组命名?

例如:

println(nameAge.name)
println(nameage.age)

【问题讨论】:

  • 您可以在 val 定义的 LHS 上解构:val (name, age) = makeTuple("test", 12)。否则,如果您想要命名访问器,请定义自定义案例类。
  • @jubobs 谢谢!有用。将其添加到答案中,我会接受。

标签: scala tuples


【解决方案1】:

正如 jubobs 提到的,我们可以这样做:

使用案例类:

 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)

使用验证:

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

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

【讨论】:

    【解决方案2】:

    请注意,案例类可以在本地定义,因此它们不会污染命名空间并且可以靠近您使用它们的位置:

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

    或者,您可以使用像 Scala Records 这样的库:

    val nameAge = Rec("name" -> "test", "age" -> 12)
    println(nameAge.name)
    println(nameAge.age)
    

    【讨论】:

    • 我以前从未听说过 Scala Records。这很漂亮。
    【解决方案3】:

    您可以将两个名称都分配给函数的输出:

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

    甚至去掉这个函数

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

    然后(在这两种情况下)您可以按如下方式执行打印:

    println(name)
    println(age)
    

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多