2014-09-29 104 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) 

,而不訴諸笨拙類型別名?