2014-09-29 73 views
3

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

type MyType = (String, String) 

当我使用这种类型,我总是要经过我最讨厌的元组编号。我当然可以做以下并解压里面是什么如下:

val (str1, str2) = myType 

我可以创建一个同伴对象为这种类型,有两个方法,让我第一个和元组的第二个元素?我想宁愿做以下事情:

myType.str1会给我第一个元素,myType.str2会给我第二个元素。

+13

你为什么不使用case类? – gwenzek 2014-09-29 11:41:20

+0

类型别名不提供适当的静态类型安全;与案例类一起去。 – 2014-09-29 11:55:23

回答

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

矫枉过正;案例班将在这里首选。 – 2014-09-29 11:54:32

+3

我同意Erik。这是过度工程,这是一个糟糕的设计的症状。一个案例类可以更加地道地服务于这个目的。 – 2014-09-29 13:46:07

+4

另外,Tuple2 *是一个case类;一个用烦人的访问器。所以在这里尝试使用元组确实没有任何好处。 – 2014-09-29 14:09:11

13

我可以创建一个同伴对象为这种类型,有两个方法,让我第一个和元组的第二个元素?

当然,这是一个案例类。

如何只

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

,而不诉诸笨拙类型别名?