我可以看到使用字符串创建自定义类型的一些好处,例如:
type UserId = String
def getUser(userId: UserId)...
与
def getUser(userId: String)...
它使您的代码更具可读性,我想如果您需要将类型从String更改为Int,它将使重构更容易。
还有哪些其他好处?
答案 0 :(得分:3)
虽然在某些情况下使用type
可以提高可读性,但如果您使用它来创建别名,则无法使代码更安全或更容易重构。考虑:
type A = String
def m(s: A) = s.length
m("12345") // It's "safe" to use String instead of A
如果您想要一个包装纸,那么您就不会通过,例如用户登录需要用户名(两个字符串),您可以使用值类:
class UserName(val name: String) extends AnyVal
def m(name: UserName) = name.name.length
m("12345") //> error: type mismatch
m(new UserName("12345")) //> 5
值类的占用空间非常小,实际上它们直接与底层对象一起运行。如果你看一下生成的代码,它实际上是:
def m(name: String): Int = name.length();
m("12345")
当你需要创建类型表达式时, type
会发光,例如:
type ¬[A] = A => Nothing
type ¬¬[A] = ¬[¬[A]]
type ∨[T, U] = ¬[¬[T] with ¬[U]]
type |∨|[T, U] = { type λ[X] = ¬¬[X] <:< (T ∨ U) }
(我想到的第一件事,归功于Miles Sabin)
答案 1 :(得分:0)
当您构建自己的库时,您希望公开好的DSL以使用您的库。有时它是通过implicits来创建中缀运算符。你可以看一下:infix operator
当你为你的类型创建隐式时,它不会发生在String中,除非你将该字符串转换为你的类型。
什么是价值?使用含义时的安全性。