在方法参数上应用函数
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
的构造函数是private
到Refined
这样我们就可以保证所有的创建都经过toUpperCase
.
我需要更新从许多地方调用的方法中的字段。我希望赋予该字段的所有值都是大写的。但我不想在需要它的方法中对其进行转换。并且不想创造另一个价值。我在问我是否可以使用一种类型的隐式来转换值?
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
的构造函数是private
到Refined
这样我们就可以保证所有的创建都经过toUpperCase
.