わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

熟達者の書くコード

def sphere(s)
  image = make2d(s,s)
  for y in 0..(s-1)
    for x in 0..(s-1)
      image[y][x] = b(s,x,y)
    end
  end
  image
end
def sphere(s)
  Array.new(s) { |y|
    Array.new(s) { |x|
      b(s,x,y)
    }
  }
end

本科目で用いるプログラムの例(上).2次元配列を作る関数make2dはあらかじめ与えている.関数bは別に定義している.これをRuby言語の熟達者に見せると「for文はほとんど使わず,下のように書く」と言われる.
(情報処理, Vol.51, No.12, p.1628.原文では2つのコードが横並びになっており,「上」「下」はそれぞれ「左」「右」と書かれている.)

下のコードでは,ローカル変数imageも,関数make2dの呼び出しもなくなっています.それでも等価なのです.すごいや.
と言いたいのですが*1,実のところfor〜in*2も,ブロックつきのArray#newも,使ったことがないので,調べました.

文法:

for lhs ...  in 式 [do]
  式..
end

式を評価した結果のオブジェクトの各要素に対して本体を繰り返して実行します。これは以下の式とほぼ等価です。

(式).each { | lhs ... | 式.. }

「ほぼ」というのは、do ... endまたは{ }によるブロックは新しいローカル変数の有効範囲を導入するのに対し、for文はローカル変数のスコープに影響を及ぼさない点が異なるからです。

http://doc.okkez.net/static/187/doc/spec=2fcontrol.html#for

new(size) {|index| ... } -> Array
長さ size の配列を生成し、各要素のインデックスを引数としてブロックを実行し、各要素の値をブロックの評価結果に設定します。
ブロックは要素毎に実行されるので、全要素をあるオブジェクトの複製にすることができます。

http://doc.okkez.net/static/187/class/Array.html

最初の引用で,出典として書いた「情報処理」は,情報処理学会の学会誌のことです.「プログラミング,何をどう教えているのか」という連載記事があって,興味深く読んでいるのでした.著者は増原英彦氏.東大の,と言えばあれだ,『情報科学入門―Rubyを使って学ぶ』を書かれた方ですね.
記事本文も,『豊富かつ強力な言語機能…短い期間で紹介するには種類が多すぎる』『教員がプログラム例を作るときに,しばしば教えていない言語機能を使ってしまう』『Rubyが標準的なグラフィック表示機能を持っていないこと』『「繰り返し」を教えるのにfor,whileループを使うか再帰関数を使うか』『「教えたいこと」が増えてゆく一方で,履修率を高めるために内容を減らす必要があり,そのバランスに腐心している』(pp.1627-1629)など,自分のCのプログラミング授業でも考えさせられるものが多数,ありました.

*1:自戒の気持ちを込めて書きますが,私は,Rubyの熟達者にも指導者にもなっていないのです.

*2:シェル上ではよく使うのだけれど.