2013-12-26 2 views
6

У меня есть класс случай, который выглядит следующим образом:Как преобразовать строку в символ в Runtime в Scala?

case class Outcome(text: Symbol) 

Теперь мне нужно, чтобы изменить значение текста во время выполнения. Я пытаюсь сделать что-то вроде этого:

val o2 = o1.copy(text.name = "foo" ++ text.name) 

Это, очевидно, дает мне ошибку компиляции:

type mismatch; found : String required: Symbol 

Как преобразовать символ в строку, добавьте/добавьте в начале что-то и снова изменить его в символ ? Или, чтобы быть более простым, как я могу изменить имя символа?

ответ

10

Вы можете использовать Symbol.apply метод:

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

val o2 = o1.copy(text = Symbol("foo" + o1.text.name)) 

Существует полезный инструмент для работы с вложенными структурами в 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) 
Смежные вопросы