toString 和 mkString 在 scala 中有什么区别?

2022-09-01 15:07:35

我有一个包含10行的文件 - 我想检索它,然后用换行符(“\n”)分隔符拆分它们。

这是我所做的

val data = io.Source.fromFile("file.txt").toString;

但是当我尝试在换行符上拆分文件时,这会导致错误。

然后我试过了

val data = io.Source.fromFile("file.txt").mkString;

它奏效了。

这到底是怎么回事?有人能告诉我这两种方法之间的区别是什么吗?


答案 1

让我们来看看类型,好吗?

scala> import scala.io._
import scala.io._

scala> val foo = Source.fromFile("foo.txt")
foo: scala.io.BufferedSource = non-empty iterator

scala> 

现在,您读取文件的变量是一个迭代器。如果对它执行调用,它不会返回文件的内容,而是返回已创建的迭代器的 String 表示形式。OTOH,读取迭代器(即迭代它),并根据从中读取的值构造一个长字符串。foo.txttoString()mkString()

有关详细信息,请查看此控制台会话:

scala> foo.toString
res4: java.lang.String = non-empty iterator

scala> res4.foreach(print)
non-empty iterator
scala> foo.mkString
res6: String = 
"foo
bar
baz
quux
dooo
"

scala> 

答案 2

toString 方法应该返回对象的字符串表示形式。它经常被覆盖以提供有意义的表示形式。mkString 方法是在集合上定义的,并且是将集合的元素与提供的字符串联接在一起的方法。例如,尝试如下操作:

val a = List("a", "b", "c")
println(a.mkString(" : "))

你会得到“a : b : c”作为输出。mkString 方法通过将集合的元素与提供的字符串联接,从集合中创建了一个字符串。在您发布的特定情况下,mkString 调用将 BufferedSource 迭代器返回的元素与空字符串联接在一起(这是因为您调用了 mkString 而不带任何参数)。这导致简单地将集合中的所有字符串(由 BufferedSource 迭代器生成)连接在一起。

另一方面,在这里调用string并没有真正意义,因为你得到的(当你没有得到错误时)是BufferedSource迭代器的字符串表示;它只是告诉你迭代器是非空的。