最近Scalaにチャレンジしていますが、イテレータの動きがよくわかりません。
Scala Documentation(リンク)にはtake(n) でイテレータがn要素先に進む、という記述があるのですが、ArrayBufferのイテレータはそうなっていません。たぶん。
下記のコードを使って確かめました。7要素持っているバッファから、2要素、3要素、4要素、とtake(n) していくコードです。val it4 = take(4) は4要素取ろうとしますが、要素が足りず2要素しか取れないことを期待しています。
val a = scala.collection.mutable.XXXXXX(0, 1, 2, 3, 4, 5, 6)
val it = a.iterator
val it2 = it.take(2)
val it3 = it.take(3)
val it4 = it.take(4) //実際には2要素しか取れないはず
it2.toList
it3.toList
it4.toList
it.toList
まずはXXXXXXの部分をListBufferにします。結果は期待通りです。
Welcome to Scala version 2.9.2 (OpenJDK Client VM, Java 1.7.0_25). Type in expressions to have them evaluated. Type :help for more information. scala> val a = scala.collection.mutable.ListBuffer(0, 1, 2, 3, 4, 5, 6) a: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3, 4, 5, 6) scala> val it = a.iterator it: Iterator[Int] = non-empty iterator scala> val it2 = it.take(2) it2: Iterator[Int] = non-empty iterator scala> val it3 = it.take(3) it3: Iterator[Int] = non-empty iterator scala> val it4 = it.take(4) it4: Iterator[Int] = non-empty iterator scala> it2.toList res0: List[Int] = List(0, 1) scala> it3.toList res1: List[Int] = List(2, 3, 4) scala> it4.toList res2: List[Int] = List(5, 6) scala> it.toList res3: List[Int] = List()
次にXXXXXXの部分をArrayBufferにします。take(n) 自体は成功しますが、イテレータは進まずに常に先頭の要素を指すイテレータが返されてしまいます。
Welcome to Scala version 2.9.2 (OpenJDK Client VM, Java 1.7.0_25). Type in expressions to have them evaluated. Type :help for more information. scala> val a = scala.collection.mutable.ArrayBuffer(0, 1, 2, 3, 4, 5, 6) a: scala.collection.mutable.Buffer[Int] = ArrayBuffer(0, 1, 2, 3, 4, 5, 6) scala> val it = a.iterator it: Iterator[Int] = non-empty iterator scala> val it2 = it.take(2) it2: Iterator[Int] = non-empty iterator scala> val it3 = it.take(3) it3: Iterator[Int] = non-empty iterator scala> val it4 = it.take(4) it4: Iterator[Int] = non-empty iterator scala> it2.toList res0: List[Int] = List(0, 1) scala> it3.toList res1: List[Int] = List(0, 1, 2) scala> it4.toList res2: List[Int] = List(0, 1, 2, 3) scala> it.toList res3: List[Int] = List(0, 1, 2, 3, 4, 5, 6)
IteratorのScala-doc(リンク)を見ると「take呼んだ後のイテレータは再利用すんなボケナス(意訳)」って書いてあるように読めます。
じゃあイテレータを再利用して良いのはどういう場合?next() だけ?不便だなあ…。
この日記サイトと、Facebookを連携させるためにFacebookのRSS Graffitiというアプリを使っていたのですが、いつのまにかFacebookのRSS Graffitiが動かなくなっていました…。
どうもこの日記サイトの出力するRSSが悪いようです。色々出力を変えて試してみるとRSS 1.0のdescriptionが長すぎるとRSS Graffitiがエラーを出します。SeaMonkeyで確認しても、descriptionが長い(80列くらい?)とエラーが出ます。
規格ではdescriptionは500バイト以内推奨だったはずなのになあ…?
メモ: 技術系?の話はFacebookから転記しておくことにした。一部、改変、追記あり。
日本赤十字社で2013年フィリピン台風被害の救援金を募集(2013年11月11日〜)していたので、1万円ほど寄付してみた。フィリピンの復興に役立つと良いなあ。
クレジットカードが使える上に、1円単位で好きな金額を寄付できます。かなり便利です。
【日本赤十字社】寄付・献血・ボランティア|2013年フィリピン台風救援金
救援金って何?という疑問への答えは、日本赤十字社のQ&Aコーナーの3つ目
「「義援金」と「救援金」はどう違うのですか?」
に書いてあります。
ざっくり言うと、日赤の被災地での活動資金として使われるのが「救援金」で、被災者の方々に直接届くわけではないとのこと。
メモ: 技術系?の話はFacebookから転記しておくことにした。
先日(2013年11月2日の日記参照)まで調子が非常に悪かった、ノートPCのWi-Fiですが、いつの間にか症状が改善していました。何故…。
そういえば最近、無線LANアクセスポイント(NEC Aterm WR8700N)のファームウェアをバージョンアップした気がします。
WR8700Nのファームウェア更新内容の説明を見ると「4. 一部のご利用環境での通信の安定性を向上しました。」とありますので、この更新がクリーンヒットだった?かもしれません。
今週はずっとPC買い換えるべきか?と、迷っていたくらいだったので、Wi-Fiの調子が上向いてきて良かった良かった。
会社の先輩の結婚式(二次会)に参加しました。二次会からだと場の雰囲気が良くわからなくて困りますね…。
本当は披露宴から出たかったのですが、会社というか人事から「研修先は、土曜も出勤あるかも?」などという紛らわしい連絡(※)されたおかげで、参加不能になってしまいました。ありもしない休日出勤ちらつかせて、一体何の嫌がらせだったんだろ?
(※)実際に研修先に行ってみたら、土曜出勤なんて全くなかった。
< | 2013 | > | ||||
<< | < | 11 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
合計:
本日: