![]() |
内包表現 |
リスト内包表現
(ブレースで囲まれた)ブロック内に複数の式が(改行またはセミコロン(;)で区切って) 置かれた場合は、最後の式が、ブロック全体の値となる。
![]() |
![]() |
ブロックの値 |
メソッドの値
s.circle(...)
の結果(の値)は
描画オブジェクト(クラス名は Ellipse)。fill(...)
を呼ぶと、その結果(の値)は、Unit型。
![]() |
メソッドの値 |
![]() |
Unit型 |
ありがちな落とし穴
以下のような記述を行うと、
val cs=for(i<-1 to 20) yield
s.circle(ranp(1000,400),20).fill(rancol)
fillメソッドの結果である Unit が集められた集合体 `` が作られる。
この時点でエラーは発生しないが、後でこのcsの各要素を 取り出して何かメソッド呼出(例えばtranslate)を行おうとしたときに、
error: value translate is not a member of object Unit
といったメッセージが表示され、エラーとなる。
ここで適切な方法としては2通りが考えられる。
一旦変数にセットしておいて、その変数をブロックの最後に あらためて「評価」させる。
val cs=for(i<-1 to 20) {
val r=s.circle(....)
r.fill(...)
r // これがブロックの値になる
}
リスト内包表記のまとめ
![]() |
if+yieldのまとめ |
関数定義の記法
![]() |
関数定義 |
=
が必要