勉強部屋‎ > ‎Go 1‎ > ‎

演習4

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

解答例

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

解説

匿名フィールド
  • 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).
ċ
4-type.go
(1k)
Tetsuo Tanaka,
2012/04/29 19:23
Comments