![]() |
for文 |
繰り返しの実現法として、for を使った構文を使ってきた。
for(i<-1 to 10) println(i)
// => 1から10の範囲の整数が各行に印字される
for(i<-1 to 10) i
// => 何も出力せず値も返さない
![]() |
for式 |
これに対し、
yield
というキーワード(今日はこれを覚えて帰ること)を使って、
for式 を書くことができる。
for式では、括弧内の意味や使い方(左矢印を使った並びの表現がここに書かれる)はfor文と変わらないが、 括弧の直後に yield が入り、以下のような構文になる。
for( 並びの表現 ) yield 式
これ全体が式として有効なので、その式の値をさらにその外側の式で使うことができる。
var ns=for(i<-1 to 10)yield i*i
// => Seq[Int] 型の値が変数にセットされる
(for(i<-1 to 10)yield i).length
// => 10 : Int
この式の値は数値ではなくデータの集合体なので、 この値に対して数値のための演算等は使えない。
(for(i<-1 to 10)yield i) + 1 // =>NG
![]() |
コレクション |
REPL で 以下のような式を与えると、その結果の型名と値が印字される。
scala> for(i<-1 to 10)yield i
res41: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
![]() |
データ型 |
![]() |
()の意味いろいろ |
Array(1,2,3)
などcolor(2)
など。![]() |
添え字 |
![]() |
要素の型 |
Array[ ... ]
のように右にブラケットがついて表示される。![]() |
サイズ取得 |
.length
メソッドで取得できる
![]() |
Seqを使う |
1 to 10
等に代わって)集合体(を生成する式や、値として保持している変数名)を書くことで、勿論この使う場面では yieldキーワードは不要。
val ns=for(i<- 1 to 10)yield i
// で、生成しておいて
// ... あとで
for(i<-ns) println(i)
// のように使う
![]() |
forの文法 |
<-
の右に Collectionを書くというもの(だということをたった今学んだ)。1 to 10
という式(これも式です)を、1.to(10)
という記法でも同じ意味になる。![]() |
描画オブジェクトの集合体 |
描画オブジェクトの集合体を作ることができる。
val cs=for(i<-1 to 10)yield s.circle(i*20,0,14)
このとき、(一度実行すると)この式の値が (REPLの出力と同等の形で) Script Editorの当該行の右のコメント部に印字されるが (ここでは値の部分は長すぎるので省略する)、
res4: scala.collection.immutable.IndexedSeq[net.kogics.kojo.staging.Ellipse] = Vector(Staging.Ellipse(Point(20.00 , 0.00),....
![]() |
オブジェクト |
こうして作った描画オブジェクトのリストの各要素に同じ処理を行うときには、
for(c<-cs) c.rotate(10)
のように使う。
![]() |
描画オブジェクトに対する操作 |
s.loop{...}
や repeat(10000){...} //回数は適当
による繰り返しの中で、簡単な操作例:
val s=Staging
s.clear
val cs=for(i<-1 to 20)yield s.circle(i*20,0,15)
s.loop{
for(c<-cs) c.rotate(5)
}
もう1つ簡単な例(点滅):
val s=Staging
s.clear
val cs=for(i<-1 to 20)yield s.circle(i*20,0,15)
var n=0 // 値が変化していくので var変数にする
s.loop{
n+=1 // n の値を1つ増やす
for(c<-cs) if(n%2==0) c.hide else c.show
}
s.loop
を repeat(1000)
などに変えた上でThread.sleep(100)
のような
時間調整を差し挟んでおくといい以下の3つの結果の違いを確認しておこう
for(i<-1 to 3) for(j<-1 to 3) yield (i,j)
for(i<-1 to 3) yield for(j<-1 to 3) yield (i,j)
for(i<-1 to 3 ; j<-1 to 3) yield(i,j)
タプルの列を処理する
val ls=for(i<-1 to 10)yield (i, i*i, ""+i)
for((n,sq,str)<-ls) println(s"""${n}->${sq}, "${str}"""")
![]() |
タプルの例 |
タプルはいくつかの式(型が違ってもいい)を()で包んだもの。
タプルの要素を1つ取り出すためには、以下のように _
の後ろに整数(1からはじめる)をつける表記がある。
(1,"1")._1
タプルの値一度に複数の変数に代入することができる。
val a,b=(1,2)
for式のループ変数の部分にもこれが適用可能
val ns=for(i<-1 to 3) yield i
val nns=ns:+4