gotagota日記

「面白きことは良きことなり」

「プログラミング入門 - Rubyを使って」 Lesson10

プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama

長らくお世話になったRuby課題もとうとう最後です。
感慨深い・・・。
最後のLesson10は「ブロックと手続きオブジェクト」についてです。

練習問題1

• おじいさんの時計 。 ブロックを取って、今日過ぎた時間の回数だけ、 ブロックを呼ぶメソッドを書きなさい。それで、もし、ブロックとして do puts 'DONG!' endを渡したとしたら、それはおじいさんの時計のような (そんなたぐいの)チャイムを打つことになります。...(中略)...
ヒント:いまの時間を得るには Time.now.hour が使えます。でも、この時間というのは、0から 23の 数字を返しますので、それを普通の時計の前面にある数字 (1から 12)へと 変換しなければなりません。

「プログラミング入門 - Rubyを使って」 Lesson10

実行結果

省略

練習問題2

• プログラムロガー。 ブロックを説明する文字列と ブロックを受け取る、logというメソッドを書きなさい。 doSelfImportantlyの例と似ているかもしれませんが、このメソッドでは、 渡されたブロックの開始を告げる文字列、修了を告げるまた別の文字列、 そしてブロックが何を返したかを告げる文字列をputsするようにします。 これにコードブロックを送って、作ったメソッドをテストしなさい。ブロックの中に 別の logへの呼び出しを入れて、それをもうひとつのブロックに 渡しなさい。(これは入れ子構造(nesting) と呼ばれます。) 別の言い方をすると、次のような出力が得られるようにしなさい。

開始 "外ブロック"...
開始 "ある小さなブロック"...
..."ある小さなブロック" 終了, 返り値は:  5
開始 "もうひとつのブロック"...
..."もうひとつのブロック" 終了, 返り値は:  I like Thai food!
..."外ブロック" 終了, 返り値は:  false

「プログラミング入門 - Rubyを使って」 Lesson10

実行結果

省略

練習問題3

• ロガー、改良版。 前のロガーの出力は少し読みにくく、多く使うほど より悪くなっていくようです。もし、内部のブロックで行が字下げ(インデント)されていれば 断然読みやすくなると思われます。それをするには、ロガーが、何か出力するたびに 何段階の入れ子になっているか保存しておく必要があるでしょう。その際、 コードのどの場所からも見ることができる変数である、グローバル変数 を使いなさい。この、グローバル変数を作るためには、$で始まる名前を 使えば良いです。たとえば、$global, $nestingDepthあるいは、 $bigTopPeeWeeはグローバル変数です。 そして、最後、ロガーは、こんなふうな出力をするようにします。

開始 "外ブロック"...
  開始 "ある小さなブロック"...
    開始 "ちっちゃなブロック"...
    ..."ちっちゃなブロック" 終了, 返り値は:  lots of love
  ..."ある小さなブロック" 終了, 返り値は:  42
  開始 "もうひとつのブロック"...
  ..."もうひとつのブロック" 終了, 返り値は:  I love Indian food!
..."外ブロック" 終了, 返り値は:  true

「プログラミング入門 - Rubyを使って」 Lesson10

実行結果

省略