代码之家  ›  专栏  ›  技术社区  ›  TomG

无法理解数组[任何]上带有“mkString”的Scala代码段`

  •  1
  • TomG  · 技术社区  · 8 年前

    我是一个探索scala的初学者。下面是Scala函数。

    def printArray[K](array:Array[K]) = array.mkString("Array(" , ", " , ")") 
    
    val array2 = Array("a", 2, true)  
    printArray(array2) 
    

    输出是 数组(a,2,真)

    我的怀疑 这里我们将数组类型指定为K。K是什么意思?是指所有类型吗? 函数“mkString”如何以数组形式给出输出(a,2,true)。 基本上我不理解连接部分。

    感谢您的帮助。

    3 回复  |  直到 8 年前
        1
  •  5
  •   Andrey Tyukin    8 年前

    这个 mkString 方法调用为

    arr.mkString(prefix, separator, suffix)
    

    将调用 toString 在所有数组元素上,在 prefix ,然后通过 separator ,最后附加 suffix 。

    类型参数 K 在里面 printArray[K] 如果忽略,则可以用存在主义替换。这只是一个名称不好、签名混乱的方法。

    存储任何基本数据类型时(如 Int )以及扩展的类型 AnyRef (如 String )在同一数组中,最小上界推断为 Any ,所以在

    printArray(array2) 
    

    这个 K 设置为 任何 ,以及 mkString公司 如上所述,粘合在一起

    Array(          prefix
    a               "a".toString
    ,               separator
    2               2.toString
    ,               separator
    true            true.toString
    )               suffix
    

    产生字符串 Array(a,2,true) 。

        2
  •  3
  •   Nazarii Bardiuk    8 年前

    K 这里不是一个类型,它是一个类型参数,为了更直观,请看一下其他问题 Type parameter in scala


    在此特定示例中 K 推断为 Any -满足所有3个值的最具体类型 "a" ,则, 2 和 true

    val array2: Array[Any] = Array("a", 2, true)  
    

    这个 mkString 函数将集合的所有项联接到单个字符串中。它在项目和开头和结尾的一些字符串之间添加分隔符。文档 mkString

        3
  •  0
  •   Ramesh Maharjan    8 年前

    如果你看你的 array2 中的定义 REPL公司 ,您将看到 array2为Any类型 ,则, Scala中所有其他类型的父类型

    scala> val array2 = Array("a", 2, true)
    //array2: Array[Any] = Array(a, 2, true) 
    

    所以当你调用函数 def printArray[K](array:Array[K]) = array.mkString("Array(" , ", " , ")") K 现在被视为 Any 返回一个字符串 初始字符串 像 Array( 和 结束字符串 像 ) 和 所有分隔的值 通过 , 。

    def mkString(start: String, sep: String, end: String): String = addString(new StringBuilder(), start, sep, end).toString

    推荐文章