好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

Ruby認定試験対策問題でRuby再勉強

明日の松江での第一回試験にはもちろん行かんが*1第二回の東京は(ネタとして)受けようと思っていたりする。受付始まらないなぁー。

一通りやって答え合わせ。正解数 53/66。かろうじて8割‥‥。自分の不勉強っぷりを思い知ったので復習用メモ。
正解率悪かった&自信なかったもの

  • irb
  • 特異メソッド
  • Proc
  • block

この辺は勉強しなおそ。irbは使ってないから置いといて、他はよくこんな中途半端な理解で今までRuby使ってたな、と自分で自分を罵ってあげたい気分でした。

中でも、2.3.2 を知らなかった自分に驚愕ですよ‥‥

ifやcaseなどの制御構文は、スコープを作らない

‥‥orz


あと、2.9.1とか。選択肢のおかげで間違えはしなかったけど。

ブロックの中で初めて代入された変数のスコープはブロックの終了と共に消滅する→×

Procオブジェクトに変換された場合は生き続ける

言われてみれば、なんとなくはわかるんだけど。Procのリファレンス見てたら、Proc#binding なんてあるの知らなかったよー、ということで、まとめて動作確認。スコープ確認用に作っただけの意味しかないサンプル。

#!/bin/ruby -Ks

power3 = Proc.new do |x|
  y = 0
  Proc.new do
    y = x*x*x
  end
end

puts '[call]'
a = [power3[1], power3[2], power3[3]]
a.each do |i|
  p i
  p i.call
end

puts '[eval]'
a.each do |i|
  eval(%q!puts "#{x}:#{y}"!, i.binding)
  eval(%q!puts "#{x}:#{y}"!, i)
end

実行結果

[call]
#
1
#
8
#
27
[eval]
1:1
1:1
2:8
2:8
3:27
3:27

JavaScriptの変数のスコープの説明もこんなサンプルと一緒にのってるよなー。いや、まさにそれを参考にして書いたんだけど。

JavaScript 第5版

JavaScript 第5版

つか、Proc#binding 便利だな。今までわざわざメソッド定義するか、その場でbinding呼んじゃってたけど、Proc#binding 使うとステキになるんじゃなかろうか。Procそのまま渡しても同じ動作なのは、見た目がなんか気持ち悪い*2

bindingもどういう原理なのかイマイチわかってないな‥‥。evalに値渡すためのおまじないぐらいの理解でいいと思ってたけど、これを機に調べるかね‥‥いつか(ダメ人間パターン)。

3.2.4 の条件式内の .. は、まったく知らなかったorz こんな便利なものを今まで見過ごしてたのか‥‥。

単純な罠に見事にはまるのもどうかと思う。2.5.3と3.1.2に見事にひっかかったorz

*1:明日はアイマスイベントだよ!!

*2:1.9 で binding 呼ばないとダメになったっぽい。気持ち悪さ解決!(07.12.26 追記)