0

我有以下两个 Scala 文件:

object ImplicitsHome {
  implicit class StringWrapper(val str: String) extends ImplicitsHome with Serializable
}


trait ImplicitsHome {
  def str: String

  def embelishString: String = {
    str.concat("fancy")
  }
}

和:

import ImplicitsHome._

class User {

  def buildSuperString(str: String): String =   {
    str.embelishString
  }
}

object User {
  def main(args: Array[String]): Unit = {
     val usr = new User()
     val fancy = usr.buildSuperString("hi")
     println(fancy)
  }

}

我想知道的是,如果我必须多次调用该embelishString函数,我会创建隐式StringWrapper类的多个实例吗?

我担心这一点,因为当使用隐式时,它会传入一个字符串(str)——它是我必须小心在embelishString函数的不同调用之间共享的“状态”吗?

4

1 回答 1

3

每次您调用embelishString- 创建的新实例StringWrapper。如果您没有用于隐式类的重型构造函数/状态,这非常便宜,通常您没有(String在您的情况下为空构造函数和指向某个 -object 的指针)。所以没有理由担心。不仅如此 -String是不可变的(so as StringWrapper) - 这意味着您无论如何都不应该担心共享状态。

例子:

 scala> implicit class Aaa(a: String) {println(a); def aa = 5} //added println to constructor
 defined class Aaa


 scala> "aaa".aa; "aaa".aa; "bbb".aa
 aaa //first instantiation (for "aaa".aa)
 aaa //first instantiation (for another "aaa".aa)
 bbb //third instantiation (for "bbb".aa)
 res4: Int = 5
于 2014-11-27T05:38:19.763 回答