如何在Scala中将字符串转换为运行时符号?

Cor*_*ped 6 string symbols scala

我有一个类似于下面的案例类:

case class Outcome(text: Symbol)
Run Code Online (Sandbox Code Playgroud)

现在我需要在运行时更改文本的值.我尝试做这样的事情:

val o2 = o1.copy(text.name = "foo" ++ text.name)
Run Code Online (Sandbox Code Playgroud)

这显然给了我一个编译错误:

type mismatch; found : String required: Symbol
Run Code Online (Sandbox Code Playgroud)

如何将符号转换为字符串,追加/前置并再次将其更改为符号?或者更简单一点,我如何更改符号的名称?

sen*_*nia 12

你可以使用Symbol.apply方法:

Symbol("a" + "b")
// Symbol = 'ab

val o2 = o1.copy(text = Symbol("foo" + o1.text.name))
Run Code Online (Sandbox Code Playgroud)

有一个有用的工具来处理嵌套结构scalaz-Lens

import scalaz._, Scalaz._

case class Outcome(symbol: Symbol)
val symbolName = Lens.lensu[Symbol, String]( (_, str) => Symbol(str), _.name)
val outcomeSymbol =
  Lens.lensu[Outcome, Symbol]( (o, s) => o.copy(symbol = s), _.symbol)
val outcomeSymbolName = outcomeSymbol >=> symbolName

val o = Outcome('Bar)

val o2 = outcomeSymbolName.mod("foo" + _, o)
// o2: Outcome = Outcome('fooBar)
Run Code Online (Sandbox Code Playgroud)