3.変数の取り扱い
(1).Rubyにおける変数とは?
そもそも変数とは何かという話になる。ソフトウェア工学上の定義からすると、『変数とは、数値データや文字列データの記憶場所に識別子をつけたもの』となっているようだ。
従って、データの実体がそこになくては変数といえない。記憶領域に名前を付けたものであると共に、実体がそこにあるわけだから、当然型も決まっているほうが望ましいのである。整数型や、不動小数点型などいう『型』だ。
その定義からすると、Rubyには『変数』が存在しないのである。
次のコードを見ていただきたい。
a = 1
この[a]が変数であるならば、まず変数[a]がメモリのどこかに確保される。そして、数値の1が代入されているわけだから、型は整数型、例えばIntegerと規定されていることが望ましい。さもないとメモリサイズが決まらないので、確保しようがない。そして、その[a]のメモリ領域の中に、[1]が格納されるということになる。
これらを踏まえると、C言語やC++言語では次のようになる。
int a = 1;
これを従来どおりの『変数』の概念で表記すると、『 int型変数[a]に、値[1]を代入する』ということになるわけだ。あくまで『変数』がメインとなる。
ところがRubyでは、まず数値の [1]というオブジェクトがメモリ上に生まれる。しかしそれだとプログラムでは扱いにくいので、便宜上 [a]という名前というか、ラベルをつけてあげるのである。
[a]というラベルは、オブジェクト[1]とは別のメモリ上に存在する。これをソフトウェア工学では、『参照』と呼ぶのだ。
Rubyにおいては、全てのものがオブジェクトであるから、厳密に言えば『変数』は存在せず、『参照』だけが存在するということになるのである。
他の言語と比較して、Rubyの誇るべき長所、それが『完全なオブジェクト指向』ということであるから、『値の格納場所としての変数』などという時代遅れのものが存在してはならないということだ。
(2).組み込み変数について
Rubyには『組み込み変数』というものがある。例をあげると次のようなものだ。
【Ruby組み込み変数(一部)】
$_ : gets などで最後に読み込んだ文字列
$0 : 実行中の Ruby スクリプト名
$* : Ruby スクリプトに与えられた引数
$& : もっとも最近の正規表現にマッチした文字列
$. : 最後に読んだ入力ファイルの行番号
ARGV : $* と同義
ARGF : 指定した引数を連結した仮想的な1つのファイルを示す
オブジェクト
なぜこのような不気味な識別子を持つ『変数』が存在するのか。
それは、Rubyが、同じスクリプト言語Perlの影響下に誕生したからだ。Perlに同様な組み込み変数がいくつも準備されているので、Rubyでも実装されているというわけだ。Rubyの開発者であるまつもとゆきひろ氏は、『Rubyにて組み込み変数を実装したことについては、非常に後悔している』と、どこかで発言されているのを読んだ記憶がある。
名前こそ『組み込み変数』となっているけれども、その正体はやはりオブジェクトになっている。従って、次のようなコーディングが可能だ。
puts $0.upcase
前述のとおり、$0には、実行中のスクリプト名が格納されている。
これに、String#upcaseという、文字列オブジェクトが持つupcaseメソッド(文字をすべて大文字にする)を作用させることが可能だ。このスクリプトを実行させると、例えば実行中のスクリプトファイル名が [test.rb]であるとすると、標準出力に[TEST.RB]と表示されるのだ。
(3).変数のスコープ
変数にスコープ(有効範囲)を持たせることができないプログラミング言語など、昔の手続き型言語を除いてまず存在しない。そもそも『変数にスコープ(有効範囲)を持たせることができない』とはどういうことであるかというと、プログラムのどの部分からも参照変更可能な、『グローバル変数』しか存在しないということである。それでは、いまどきまともなプログラムなど作りようもないということは、万人の知るところである。
Rubyでは、以下のとおり、変数にスコープを指定することができる。
定数 … 大文字で始まる 例:VAR
グローバル変数 … $で始まる 例:$var
ローカル変数 … 小文字で始まる 例:var
クラス変数 … @@で始まる 例:@@var
インスタンス変数 … @で始まる 例:@var
『クラス変数』や、『ローカル変数』についての解説は、後ほどクラスの解説と併せて行うつもりだ。
以上で、変数の種類と取り扱いについての概要説明は終了したわけだが、先ほどより、なにやらメールチェッカがチカチカと点滅しているようなのだ。
気になって気になって仕方がないぞ。とっくに就寝時間を過ぎておるのだが、娘からの返事を待っている旨看護士殿に伝え、パソコンつけっぱにしておくことを了承してもらったのだ。
皆さん、スクリプト言語Rubyについての解説は一旦おいておき、メールをチェックさせていただいてよいかな?あ、よい。まことにかたじけない。
お!?なんと、真紅よりの返信ではないか。やっと返事を送ってきおったかあの親不孝娘が。まさか、母親が倒れたのも知らず、カラオケでアゲアゲしておったのではあるまいなあ。『本当の母親じゃないからカンケーねぇじゃん』などとな。
パパへ
心配かけてごめんね。
今、ひょんなことから、ノルゴリズムという別世界に来て
しまったの。ここは、剣と魔法が支配する不思議な世界よ。
でも、そんなこと信じられないでしょうね。
私だって信じられないの。でもこれは本当のことなの。
この世界のどこかにあるという『暗黒のオーブ』に、
お義母さんの心が閉じ込められていて、それが原因で、
そちらの世界でお義母さんが原因不明の昏睡状態に
陥っているらしいわ。
その『暗黒のオーブ』を破壊しなければ、お義母さんを助ける
ことができないのよ。
私は、その使命をなしとげるため選ばれて、この世界に連れて
こられたみたいなの。
『暗黒のオーブ』を破壊するためには、この世界の暗黒面を
支配する『ゴメラドワル』と戦い、勝利を収めなきゃいけない
んだけれど、強力な魔力を持つ魔導師のガフンダルさんや、
ここ一番役に立つ男の中の男、パソコンの長七郎さんたちが
助けれくれるから、きっと目的を達成できると思うわ。
だから安心して。
また連絡するから。
真紅
… … … …
なんだこりゃ?ちょっと待て。もう一度じっくり読んでみよう。
… … … …
うーむ。やはり、このメールには常識では到底考えられない内容が記してあるようだ。心配していたように、本当の母親ではないから自分には関係ないなどと、シカトを決め込む娘ではなかったのは喜ばしいが、あろうことか、別世界に紛れ込んだなどといっておる。もしかして『電波ちゃん』になってしまったのではなかろうな。大切な一人娘なのだぞ。それなら、アゲ系コギャルなってくれたほうが、現実に根ざしているだけマシというものだ。
しかし、メールの内容を熟読吟味したところ、『別世界に連れて行かれちゃった』などという、とことんふざけた大きな意味での破綻は度外視して、細部に関しては論理的におかしなところはないようだ。文章もしっかりしているし。
ここは一番、己の娘を信ずるしかないのか。
とにかくもう少し詳しい情報が知りたい。もう一度メールを送ってみよう。
FROM : 実装寺健一郎<[email protected]>
TO : 真紅<[email protected]>
subject : Re:Re:いまどこにいるのだ?
親愛なる真紅
やっと返事を送ってくれたね。パパはこれで一安心だ。
と、言うとでも思ったかこの別世界連れ去られ娘が!
できればもう少し詳しいことをしりたい。といっても、
メールの内容からすると、真紅本人にも詳しいことなんて、
全然わかっていないのかもしれないが。
真紅と連絡をとる方法は、メールしかないのか?携帯電話は
どうしたのだ?そうか。中学校は携帯電話持込禁止だからね。
そうだ、ライブチャットはできないのか?パソコンにはカメラ
がついていただろう。そうすれば、真紅の元気な姿も見ること
ができるし、別世界にいることもこの目でたしかめることがで
きよう。
できるだけはやく返事をくれたまえ。
追伸:
ところで真紅よ。納期までにプログラムを完成させるコツは、
一に残業、二に残業、三、四がなくて五に徹夜。だぞ。
これを肝に銘じておきたまえよ。
最終更新:2008年12月05日 08:20