第2回名古屋Scala勉強会にいってきた

ひっさしぶりに勉強会に参加しました。やっぱ勉強会いいね、良い刺激になる。

名古屋Scala勉強会は、Scala本を読んで皆が思った疑問点を解消していこうぜ、ってノリ。

かなりRubyとかHaskellとかの言語仕様の深い話まで出ましたが、

触った事ないので、とりあえずそれは置いといて、高卒文系プログラマ(自分)にわかりやすくまとめてたいと思います。

【個人的見解】の所は、帰りの電車内で該当箇所をもう一度読んでみた結果の見解という事で、

あんまり信用なさらずに。

ちなみに、コード例は自宅に帰ってから試したものです。

疑問点とか詳細はコチラ-> 名古屋Scala勉強会 | Google グループ

第01章

1. ScalaのトレイトはJavaのインターフェースとどう違うの?

Javaのインターフェイスは型の定義、Scalaのトレイトは実装も定義できる。

Javaのインターフェイスにあたるものは、Scalaでは抽象トレイトとして定義できる。

2. C#のvarとの違い

C#のvarは、型推論の為に使われる。

Scalaのvarは、型推論には関与していない。再代入できる変数の定義、という意味でしか使われない。

3. ScalaのトレイトはRubyのモジュールとどう違うの?(継承可否と名前解決とか)

イミフw

とりあえず同じような感じ?

【個人的見解】

ダイヤモンド継承に対応するアプローチが違うんじゃないかな、と。

Rubyは実装が上書き(?)されて、Scalaは型階層が線形化する。

第02章

1. scalaインタプリタについて

勉強する分には、バージョンを意識する必要は無い、との事。

2. java.lang型

java.langパッケージに属するクラス郡、の誤記?

Javaでパッケージ内のクラス郡をリフレクションで取得できたらいいよね、という声も

3. valの再定義

インタプリタは新しい入れ子のスコープの中で、変数を再定義している。

scala> val list = List(1,2,3)
list: List[Int] = List(1, 2, 3)
scala> val list = List("1","2","3")
list: List[java.lang.String] = List(1, 2, 3)
scala> list
res1: List[java.lang.String] = List(1, 2, 3)
scala>
4. 関数のパラメータ型

実装の都合上。

【個人的見解】

引数の型指定が無いと何が渡されるかわからない=コンパイル時にメソッド内の実装情報から型推論できない。

よくよく考えると、型推論って変数束縛時にしてくれるもので、

関数のパラメータは、まだ変数の中身がわからない状態なので、型も推論できない、とか?

5. if式

elseを省略した場合はUnitが返る。条件式を満たしてもUnit。

scala> println(if (true) 1)
()
scala> println(if (true) 1 else 2)
1
scala> println(if (false) 1 else 2)
2
6. Scalaのジェネリクス

とりあえず高度な話題だと言う事はわかったw

うん、それだけww

【個人的見解】

Javaで例える話があったけど、聞くのに必死で発言するの忘れてた件。

まぁ直接は関係無い話なので、参考までに。

<T> Comparable<T> max(Comparable<T> c1, Comparable<T> c2);

上記メソッドの実装でComparable#comparaToを使う場合、

Comparable#comparaToの引数はT型である為、

c2はT型にキャストする必要あり。キャストしない場合、無検査警告。

第一引数のサブクラスのオブジェクトを第2引数で指定した場合、

サブクラスの定義で、Comparableの型パラメータを親クラスと違う型を指定した場合

コンパイルエラーが起こる。

public class Main{
    public static void main(String[] args){
        String1 str1 = new String1("ssss");
        String2 str2 = new String2("zzzz");
        System.out.println(max(str1, str2));
    }
  public static <T> Comparable<T> max(Comparable<T> c1, Comparable<T> c2){
      return (c1.compareTo((T)c2) > 0) ? c1 : c2;
  }
  public static class String1 implements Comparable<String1>{
      String value;
      public String1(String value){ this.value = value; }
      public int compareTo(String1 s){ return this.value.compareTo(s.value); }
      public String toString(){ return value; }
  }
  public static class String2 extends String1 implements Comparable<String2>{
      public String2(String value){ super(value); }
  }
}
Main.java:23: java.lang.Comparable を異なる引数 <Main.String2> と <Main.String1>
で継承することはできません。
public static class String2 extends String1 implements Comparable<String2>{

Comparableの型パラメータに上限境界ワイルドカードの指定が無い為。

コンパイルエラーにさせないためには、サブクラスでComparableを再実装しなければいいだけ。

その場合、サブクラスでcomparaToをオーバーライドしようとした場合の引数はString1となる。

オブジェクトの透過性が保てるかどうかは、サブクラスの実装者に委ねられる。

7. Unit

空タプルの意。

なんか、結構いろんな言語で使われているらしい。。。

8. ++を実装しない理由

「++」は、実装している言語があんまり無い。C系だけ?

関数型言語では、あまり用途が無い。

9. 要素ε集合

「要素∈集合」の誤記。

ま、読み方さえもわからないんですけどねw

第03章

1. パラメーター化?

配列に対しての型指定の話。

parametelizeの日本語訳。

【個人的見解】

「配列の型パラメータの指定」と同義かと。

2. 括弧を省略できる条件

レシーバーを明示的に指定したときだけ。

3. レシーバーがnullの場合の呼出し

NullStringなるものがあるらしい。

Javaとはちょっと挙動が違う。邪悪。

配列とかだと、java.lang.NullPointerExceptionが投げられる。

scala> var str:String = null
str: String = null
scala> str + "value"
res6: java.lang.String = nullvalue
4. Scalaでは三項演算子は作れない?

一応できる。

id:bleis-tiftさんが試したところ、とてもじゃないが実用レベルには至らなかったらしい。

括弧が多くなる、との事。

5. Scalaではconjunctionalな演算子は作れない?

できない事は無い、との事。

すんません、ぶっちゃけ良く覚えてないですw

ケースクラスがあるので、必要性もあまり感じないです。

6. dropRightという名前

数学的な標準っぽいらしい。

7. ミュータブルな集合は+と+=に差がない?

結果型に差がある。

scala> import scala.collection.mutable.{Set => MutalbleSet}
import scala.collection.mutable.{Set=>MutalbleSet}
scala> val set = MutalbleSet(1,2,3)
set: scala.collection.mutable.Set[Int] = Set(3, 1, 2)
scala> set + 4
res8: scala.collection.mutable.Set[Int] = Set(3, 1, 4, 2)
scala> set += 5
scala>
8. 「varを取り除けば、より関数的なスタイルのコードになる」

valいいよね、という結論w

varとvalは一文字違いってのは、英語圏じゃない人からしたらわかりずらいのでは、という話も。

【個人的見解】

保守をやっている自分からすれば、コードリーディングが楽になるので、val推奨派。

Javaでも一画面に収まらないコードの場合、finalをよく使います。

まとめ

  • Scala本が終わったら、Scalaハッカソンをやる。
  • 北村さん(RKTMさん)がLTすると、通常の三倍の女子が集まる。
  • CT名古屋=カジュアルスポーツ名古屋。PCに向かうのは目の運動。
  • 「楽しかったんだから、皆リアル充実してるじゃん!」

いじょ。

このエントリーをはてなブックマークに追加
comments powered by Disqus