【问题标题】:Can I name a tuple (define a structure?) in Scala 2.8?我可以在 Scala 2.8 中命名一个元组(定义一个结构吗?)?
【发布时间】:2011-04-10 21:50:18
【问题描述】:

每次我需要它时总是重复一个行长的元组定义对我来说不是很好。我可以命名它并用作类型名称吗?最好命名它的字段,而不是使用 ._1、._2 等。

【问题讨论】:

    标签: scala syntax types


    【解决方案1】:

    关于您的第一个问题,您可以简单地使用类型别名:

    type KeyValue = (Int, String)
    

    当然,Scala 是一种面向对象的语言,所以关于第二个关于如何特化元组的问题,神奇的词是继承:

    case class KeyValue(key: Int, value: String) extends (Int, String)(key, value)
    

    就是这样。该类甚至不需要正文。

    val kvp = KeyValue(42, "Hello")
    kvp._1    // => res0: Int    = 42
    kvp.value // => res1: String = "Hello"
    

    但是请注意,从案例类(Tuple2 是)继承已被弃用,并且将来可能会被禁止。这是针对上述类定义的编译器警告:

    警告:案例类 class KV 具有案例类祖先 class Tuple2。由于过度复杂的使用和实施,这已被弃用。您应该改为使用提取器在非叶节点上进行模式匹配。

    【讨论】:

      【解决方案2】:

      类型别名可以很好地命名您的元组,但请尝试使用案例类。您将能够使用命名参数

      元组示例:

      def foo(a : Int) : (Int, String) = {
        (a,"bar")
      }
      val res = foo(1)
      val size = res._1
      val name= res._2
      

      有一个案例类:

      case class Result( size : Int , name : String )
      def foo(a : Int) : Result = {
        Result(a,"bar")
      }
      val res = foo(1)
      val size = res.size
      val name= res.name
      

      【讨论】:

      • 元组的工作速度不是比案例类快吗?任务是对大量简单数据的复杂处理,一种数字运算。
      • @Ivan:元组是案例类,不是吗?
      • 元组确实是案例类!
      • 有没有办法在循环中添加元素到res?
      【解决方案3】:

      这是一个创建类型别名和工厂对象的解决方案。

      scala> type T = (Int, String)                          
      defined type alias T
      
      scala> object T { def apply(i: Int, s: String): T = (i, s) }
      defined module T
      
      scala> new T(1, "a")
      res0: (Int, String) = (1,a)
      
      scala> T(1, "a")
      res1: (Int, String) = (1,a)
      

      但是正如其他人所提到的,您可能应该只创建一个案例类。

      【讨论】:

        【解决方案4】:

        尽管正如其他人所说,显式(案例)类在一般意义上是最好的。

        但是对于本地化场景,您可以做的是使用tuple extractor 来提高代码可读性:

        val (first, second) = incrementPair(3, 4)
        println(s"$first ... $second")
        

        给定一个返回元组的方法:

        def incrementPair(pair: (Int, Int)) : (Int, Int) = {
          val (first, second) = pair
          (first + 1, second + 1)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-02
          • 2011-04-25
          • 2020-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多