«前の日記(2005年03月08日) 最新 次の日記(2005年03月10日)» 編集

Matzにっき


2005年03月09日 [長年日記]

_ [言語] Eleven続き

昨日、「ElevenのアイディアをRubyのライブラリとして実装する人はいないだろうか」などと書いたら、 moriqさんがRailsで実装してくださった。

こんな感じ。

require 'eleven'

class FooController < ApplicationController
  include Eleven
  statesafe :first, :last

  display {
    print "Please enter your name."
    edit "First name: ", @first
    edit "Last name: ", @last
  }

  display {
    print "Thank you, ", @first, " ", @last, "."
  }
end

第一歩としては上出来ではないだろうか。

_ [Ruby] Meetup Group Meeting レポート

昨日プレッシャーをかけておいたので、 Meetup Groupミーティングのレポートのようなもの が、かずひこくんのところにアップされた。注目。

_ [Ruby] Ruby 2.0 ブロックローカル変数

昨日のミーティングで話そうと思ってて、 あまり盛り上がらなかったので触れなかった話題。

Rubyのブロックスコープをなんとかしたいとずっと考えてきた。 で、今までにもいろいろなアイディアを練ってきたのだが、なかなか決められなかった。 最近になってやっと「これなら」というものが出来上がったように思う。

仕様は以下の通り。

  • ブロックパラメータはローカル変数のみ
  • ブロックパラメータのスコープはブロックローカル
  • ブロックパラメータ名が外側のローカル変数と重複したらエラー(前田くんの勝ち)※
  • ブロックパラメータの後ろに「; 変数」という形でそのブロック内でだけ有効な変数名を指定できる※
  • これらの変数も重複はエラーになる
  • ブロック内で初出の変数のスコープはブロックローカル(今まで通り)※
  • メソッド内で使われたスコープが終わってしまった変数への参照は警告になる※

今まで「2.0ではこうする」と宣言してきたものとは違うが(特に※の部分)、 互換性はより高いし、使い勝手も悪くなってないと思う。 特に「ブロック内初出のローカル変数のスコープ」については、 メソッドスコープにすることを強く反対していた dblack はよろこぶことだろう。

さて、これにより

3.times {|i; a|
  a = 5
  p [i, a]
}

のような文が許されることになる。本当は

3.times {|i; a=5|
  p [i, a]
}

のように初期化もいっしょにしたいが、「|」が式の中に登場することのある演算子なので、

  • あきらめる
  • 初期化にはprimary(リテラルとか変数とか括弧でくくった式とか)しか許さない

のいずれかになりそうだ。

3.times {|i; a=2+3|
  p [i, a]
}

がエラーになるのを受け入れられるかどうか、だな。


«前の日記(2005年03月08日) 最新 次の日記(2005年03月10日)» 編集