Scala类型类

3

我有一个自定义类型的定义如下:

type MyType = (String, String)

当我使用这种类型时,我总是不得不经过我讨厌的元组编号。当然,我可以按照以下方式进行拆包:

val (str1, str2) = myType

我可以为此类型创建一个伴生对象,提供两个方法来获取元组的第一个和第二个元素吗?我希望能实现以下功能:
myType.str1 获取第一个元素,myType.str2 获取第二个元素。

13
你为什么不使用一个 case class? - gwenzek
类型别名不能提供适当的静态类型安全性;使用 case class。 - Erik Kaplun
2个回答

13

我能为这个类型创建一个伴生对象并有两个方法,分别给我元组的第一个和第二个元素吗?

当然可以,这就是 case class 的作用。

只需要这样:

case class MyType(str1: String, str2: String)

不采用笨拙的类型别名,该怎么办呢?


3
这个怎么样:
scala> type MyType = (String, String)
defined type alias MyType

scala> implicit class MyPair(val t: MyType) extends AnyVal {
     |   def str1 = t._1
     |   def str2 = t._2
     | }
defined class MyPair

scala> val mt: MyType = ("Hello", "World")
mt: MyType = (Hello,World)

scala> mt.str1
res0: String = Hello

scala> mt.str2
res1: String = World

17
过度杀伤力;在这里最好使用case class。 - Erik Kaplun
3
我同意Erik的观点。这是过度设计,是糟糕设计的症状。一个案例类会更符合惯用法来实现这个目的。 - Gabriele Petronella
4
另外,Tuple2 一个case类,但它具有令人讨厌的访问器。因此,在这里尝试使用元组实际上没有任何好处。 - Wilfred Springer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接