创建类型别名的好处与使用String相反

时间:2016-10-05 18:13:56

标签: scala

我可以看到使用字符串创建自定义类型的一些好处,例如:

type UserId = String

def getUser(userId: UserId)...

def getUser(userId: String)...

它使您的代码更具可读性,我想如果您需要将类型从String更改为Int,它将使重构更容易。

还有哪些其他好处?

2 个答案:

答案 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中,除非你将该字符串转换为你的类型。

什么是价值?使用含义时的安全性。