演習4

演習3のプログラムを変更し,テキストを0.5秒毎に1文字ずつ表示するメソッドPlayを定義せよ.その際,*TextBoxを匿名フィールドとして埋め込んだ型を新たに定義し,その新たに定義した型で,TextBoxのメソッドを利用できることを確認せよ.

解答例

  1. package main
  2. import (
  3. "time"
  4. "./textbox"
  5. )
  6. const text = "The Go programming language is an open source project to make programmers more productive."
  7. // --- ProblemBox ---
  8. // 問題文を0.5秒ごとに1文字ずつ表示するデータ型.
  9. type ProblemBox struct {
  10. *textbox.TextBox
  11. text string
  12. }
  13. // 位置,大きさ,表示する問題文を指定してProblemBoxを生成する.
  14. func New(x,y,w,h int, s string) (pb *ProblemBox) {
  15. return &ProblemBox{textbox.New(x,y,w,h),s}
  16. }
  17. // 問題文を0.5秒ごとに表示する.
  18. func (pb *ProblemBox) Play() {
  19. pb.Clear()
  20. for i:= 0; i < len(pb.text); i++ {
  21. pb.Putc(pb.text[i])
  22. time.Sleep(5e8)
  23. }
  24. pb.Puts("[Enter]");
  25. }
  26. // --- ProblemBox end ---
  27. func main() {
  28. textbox.Clear()
  29. t1 := New(3,3,70,4, text)
  30. t1.Play()
  31. }

解説

匿名フィールド

  • 11行目から14行目では,新たな型ProblemBoxを定義し,その中に匿名フィールド*TextBoxを埋め込んでいます.TextBoxはtextboxパッケージで定義されている型なので,*textbox.TextBoxと記述しています.ProblemBoxには匿名フィールドの他に,問題文を保持するためのtextというフィールドを持たせます.
  • 関数Newでは,ProblemBox型のデータを生成します.18行目では,組込み関数のnewを使う代わりに,複合リテラルを使って,初期値の設定とメモリ割り当てを同時に行っています.匿名フィールドの初期値には,textboxパッケージの関数New()で生成したTextBox型のデータへのポインタを設定しています.
  • 匿名フィールドについては,匿名フィールド(埋め込みフィールド)で継承のようなことや言語仕様を参照してください.

Sleep関数

  • 0.5秒ごとに文字を表示するために,timeパッケージの関数Sleep()を用います.
  • timeは,時間の計測と表示機能を提供するパッケージです.
  • Sleepのシグネチャは func Sleep(ns int64) os.Error です.64ビット長の整数を引数(nsとします)にとり,nsナノ秒間,プログラム(ゴルーチン(後報))を停止します.
  • 27行目の time.Sleep(5e8) で,5*10^8ナノ秒間(= 0.5秒間)停止します.
  • timeパッケージを利用するには,それをインポートする必要があります.constと同様に,importでも()を使って,複数のパッケージのインポートをまとめて記述することができます.2行目から5行目では,timeとtextboxの二つのパッケージのインポートをまとめて記述しています.
  • timeパッケージの詳細は,パッケージドキュメントを参照してください.
  • ちなみに(この演習には関係ありませんが),date=time.LocalTime().Format(time.RFC3339) とすることで,現在時刻をRFC3339の形式で得ることができます.従って,date[0:4]+"年"+date[5:7]+"月"+date[8:10]+"日" で,YYYY年MM月DD日という形式の文字列を得ることができます.

プログラムの動作(Play)

  • 23行目でProblemBoxをクリア.
  • 26行目で,問題文textから1文字ずつ取り出し,その文字を表示.26行目のPutcはTextBoxのメソッドだが,ProblemBoxに*TextBoxが埋め込まれているので,ProblemBoxのメソッドとして呼び出すことができる.
  • 27行目で,0.5秒停止.
  • 29行目で[Enter]を表示.

プログラムの動作(main)

  • 35行目で画面全体をクリア.
  • 37行目でProblemBoxを生成.
  • 38行目で,ProblemBoxを再生(Play).