在方法参数上应用函数

Apply function on method parameter

我需要更新从许多地方调用的方法中的字段。我希望赋予该字段的所有值都是大写的。但我不想在需要它的方法中对其进行转换。并且不想创造另一个价值。我在问我是否可以使用一种类型的隐式来转换值?

def parent(itemType: String) =
   getValue(itemType.toUperCase)

def parent(itemType: String) = 
   getValue(itemType)

getValue(itemType: String) = {
  val formattedValue = itemType.toUperCase
}

我想避免这两种方法,并要求这样的东西:

getValue(itemType: String = itemType.toUperCase) = { 
   // use itemType as upercase value
}

最好的办法是在类型系统中具体化大写。

import scala.language.implicitConversions

object Refined {
  class UppercaseString private[Refined](override val toString: String) extends AnyVal

  implicit def stringToUpper(s: String): UppercaseString = new UppercaseString(s.toUpperCase)

  implicit def upperToString(ucs: UppercaseString): String = ucs.toString
}

然后你可以用

表示一个字符串必须是大写的(并透明地使一个普通的字符串大写)
import Refined._

def getValue(itemType: UppercaseString) = ???

隐式转换为UppercaseString的存在意味着,只要导入了Refined.stringToUpper,我们就可以用任意字符串调用getValue

因为UppercaseString扩展了AnyVal,在很多情况下它不会有超过大写字符串的开销。由于它是一个类型,调用代码可以将其保存为 UppercaseString 并保存对 toUpperCase.

的调用

注意implicit class在这里不起作用,因为我们要在“构建”过程中执行操作; UppercaseString的构造函数是privateRefined这样我们就可以保证所有的创建都经过toUpperCase.