LL脳がscalaの勉強を始めたよ その4

第3章後半…の前半

コップ本の3章後半の中でSetとかMapとかそのあたりを…後半をまとめてやろうと思ったけど盛りだくさん過ぎてまとめるのに力尽きました…orz

基底トレイト?

SetやMapはソレゾレ同じ名前のmutable版とimmutable版の2種類あるので、その元になる概念を持っているのです、という話かな…と

んで、トレイトはJavaでいうインターフェイスクラスに似たものらしいんだけども…interfaceってのがいまいちわからないのでググってみます…すっかりgoogle脳ですな

google様にお伺いを立ててみたところ、インターフェイスクラスはabstractクラスに似ているけども次のような違いがあるらしい…ということみたい、解釈が間違ってる可能性がとてもあるんだけども

abstractは継承して中身を実装しないと使えないクラスのことで、interfaceはクラスへの必須条件を定義するためのテンプレートみたいなもの

実際の違いとしては
1)abstractは一つしか継承できないが、interfaceは複数実装可能
2)abstractでは共通メソッドを定義可能、interfaceでは中身のあるメソッドは実装不可

ここを参考にしました

ものすごく理解があやふやなんだけども、詳しくは12章でやるらしいので思い切って先に進みます。ついでにextendやmixinなんていう怪しげワードが出てきてるのも後でやるだろうから見ないふりします。たぶん継承関連だろうし…

ちなみに久々に基底という単語を聞いて、線形代数的に嫌な気分になったのは秘密。

Set

とりあえずSetは標準ではimmutable。mutableなSetを使いたいときはimportするみたい。

標準のSetの例

val hogeSet = Set("huga", "moga")

mutableなSetの例

import scala.collection.mutable.Set
val hogeSet = Set("huga", "moga")

ちなみにmutableなSetを使った後でimmutable版を使いたい場合は下のようにimportしなおす必要あり

import scsala.collection. immutable.Set
Setへの要素の追加

Setに値を追加はmutable版でしかできない。mutable版での要素追加は+=というmutable版Setのもつメソッドを使うので下のような感じで表現できる

// 実際の書き方
hogeSet += "muga"
// 内部的な処理
hogeSet.+=("muga")

immutable版Setはそもそも+=メソッドをもっていないので、要素追加風の操作を行いたい場合はvar定義で行う。

var hogeSet = Set("huga", "moga")
hogeSet += "muga"

上の例はmutable版と同じように操作はしているものの、実際は下のような操作で変数そのものを再定義しているので、var定義じゃないと行えないとのこと

hogeSet  = hogeSet + "muga"
SetとListの違い

ここまで読んできて、SetとListの違いは何かしら?と思ったので脱線して"調べてみる"

  • Setは重複を許容せず、順序性をもたない
  • Listは重複を許容して、順序性をもつ

とのこと、確かに言葉の定義通りの性質があるわけね、なるほど(・∀・)

Setの使い方

コップ本には存在チェックぐらいしか例がないから調べないとなぁ…

Setの要素存在チェックは下みたいにcontainsを使う

hogeSet.contains("huga")
// コレでもできるっぽいけど、正しい?
hogeSet("huga")
ここで恥ずかしい疑問

SetとHashSetの違いがわからない…(´・ω・`)ナニが違うの?あと先走ると、MapとHashMapも…

Map

キーと値を持つPHPでいう連想配列みたいなの…と勝手に解釈

mutable、immutableの違いはSetと同じ、標準はimmutable版

immutable版のMap

定義とか参照とかをでろでろ書いてみる

// import方法、標準なので普段はいらないけど
import scala.collection.immutable.Map
// 定義はこう
val testMap = Map( 1->"hoge", 2->"huga", 3->"moga")
// 参照方法
testMap(2)

上の例では型推論を使って楽をしているけど型を指定する場合は下のようにするとのこと

val testMap = Map[Int, String]( 1->"hoge", 2->"huga", 3->"moga")

また、要素を追加したいときはSet同様にvar定義すればできる…けど普通はやらんよなぁ…

mutable版のMap

immutable版と同様にサンプルを書いてみる。あまり変わらないけどもー

// import方法、必須
import scala.collection.mutable.Map
// 定義はこう
val testMap = Map( 1->"hoge", 2->"huga", 3->"moga")
// 参照方法
testMap(2)

ちなみに、超冗長に書くと下のような感じになりマス

import scala.collection.mutable.Map
val testMap = Map[Int, String]()
testMap += (1->"hoge")
testMap += (2->"huga")
testMap += (3->"moga")
testMap(2)
以上ー

実際使ってみないと何が出来るのかわからないなぁと思うのと同時に、データ構造のお勉強サボりすぎてるなぁ…と反省。それとまとめるスピードが遅すぎなので、頑張って早くしていきたいなぁと…慣れるしかないんですけドモ

3章の後半の後半は関数型っぽいファイル操作の内容デス