Edited at

[Scala]PHPerのScala入門メモ(途中)

More than 3 years have passed since last update.


変数宣言

val => 再代入不可

var => 普通の変数 ※Scalaではなるべく使わない



命名規則

原則はキャメルケース

”_”は特別な意味を持つので使わない。

http://docs.scala-lang.org/style/naming-conventions.html



関数を定義する


PHPの場合

function add (x, y) {

return x + y;
}
$this->add(1, 2);


Scalaの場合

def add (x: Int, y: Int): Int = {

// return文は必要ない限り書かない
x + y
}
add(1, 2)



配列・リスト

どちらも同じ型を格納する


PHPの場合

$stringArray = array("hoge", "one", "foo");



Scalaの場合

val stringArray = Array("hoge", "one", "foo")



PHPの場合

// PHPにリストって概念ある・・・?



Scalaの場合

val integerList = List(1, 2, 3)




制御文


for文


PHPの場合

$integerList = array(1, 2, 3);

foreach ($integerList as $int) {
if (($int % 2)) { continue; }
echo $int . PHP_EOL;
} //2


scalaの場合

object main extends App {

val ary = Array(1, 2, 3)
// ここでフィルタリングできる
for (num <- ary if (num % 2 == 0))
println(num)
}

Scalaはすぐにfor文内で処理する変数(ここではnum)がわかるのでよい。


yield

計算結果を保持してくれる。どういう時にうれしいかはまだ不明。

※追記:mpywさんありがとうございます

http://php.net/manual/ja/language.generators.overview.php


scalaの場合

val ary = Array(1, 2, 3)

for (num <- ary)
yield num * 2



foreach文

Scalaの場合、foreachは制御構文として扱われない。

各クラスのメソッドとして扱われる。


PHPの場合

$integerList = array(1, 2, 3);

foreach ($integerList as $int) {
echo $int . PHP_EOL;
}


Scalaの場合

val integerList = Array(1, 2, 3)

integerList.foreach(println)
/* ちゃんと改行もしてくれる
1
2
3
*/




switch文


PHPの場合

switch ($string) {

case "hoge":
echo "hoge";
break;
case "foo":
echo "foo";
break;
case "bar":
echo "bar";
break;
default:
echo "placeholder";
}


Scalaの場合

// switchに似たmatchがある.これはScalaっぽくない書き方。

string match {
case "hoge" => println("hoge")
case "foo" => println("foo")
case "bar" => println("bar")
case _ => println("placeholder")
}



class



trait

extendsでは静的な束縛をされる

withでは動的な束縛がされる


PHPの場合

trait Access {

function howTo() {
echo "HowTo";
}
}
class Company {
use Access;
}
$access = new Company();
$access->howTo(); // HowTo


Scalaの場合(extends)

trait Access {

def howTo() {
println("HowTo")
}
}
class Company extends Access {
override def toString = "hoge"
}
val company = new Company
company.howTo() // HowTo