はじめに
Scalaでタプルの各要素をリストっぽく (要素番号)
で取り出そうとした時にエラーでたので少し調べた内容まとめます。
勉強したことを自分の備忘録として残してます。
まだまだ勉強中なので、誤りありましたらご指摘いただければと思います。
リストとタプルの違い
- リスト
- 全て同じ型の要素でなければならな
-
(要素番号)
で要素を取得 - 要素番号が
0
始まり
- タプル
- 異なった型の要素を持つことができる
-
._要素番号
で要素を取得 - 要素番号が
1
始まり
リストで取得
scala> val hoge:List[String] = List("Hello", "World")
hoge: List[String] = List(Hello, World)
scala> println(hoge(0))
Hello
ちなみに、異なる型の要素を持とうとすると Int はあかんと怒られる。
(型を Any
ってすれば一応怒られないけど、各要素の型情報が失われるのでダメです!)
scala> val hoge:List[String] = List("Hello", "World", 1)
<console>:11: error: type mismatch;
found : Int(1)
required: String
val hoge:List[String] = List("Hello", "World", 1)
タプルで取得
scala> val hoge = ("Hello", "World", 1)
hoge: (String, String, Int) = (Hello,World,1)
scala> println(hoge._1)
Hello
scala> println(hoge._3)
1
なぜ?
リストのapplyメソッドが常に同じ型の値を返すのに対して、タプルの各要素は異なる型になっている。
そのため、タプルはメンバにアクセスして取得するのでリストみたいに (要素番号)
で取得できない。
ちなみに、タプルの要素番号が 1
始まりなのはHaskellやMLなどの他の言語にからの伝統らしい。
参考