まだ終わらない(苦笑)。
...その名前は<値への名づけ以前>、つまりコードを書いただけの段階でも存在するような気がしますし、...
いや、プログラムは台本のようなものですから、実行時世界には存在しないんです。
登場人物が台本の内容に言及してしまうと、 舞台はスラップスティックになってしまいます。 そういうメタな話は(たまには面白いですけど)やっぱり反則に近いですよね。
「関数のパラメータ」や「一時変数」というのは、あとから 値を利用できるように箱にとっておく、つまり箱モデル そのものと思っており、名前をつけるという感覚がまったく ありません。
いや、まあ、人の持つイメージは想像以上に多様だということでしょう。 私の数学のイメージは「紙と鉛筆」です。 途中結果は紙に書きなぐられた数または式です。 これが他のなにかとごっちゃにならないように名前をつけておく、 というのが私の「数学の変数」に対するイメージですね。 たとえば z = x + y を考える時、私は「xとyという箱から値を取り出して、両者を足した値をzという箱に入れる」ではなく、 「x + yという式にzという名前をつける、今後zを見たらx + yのことだと思う」とします。lazyですね。
余談ですが、私の数学科の友人の恩師は「数学者には紙と鉛筆があれば良い」と言って、 コンピュータに否定的だったそうです。間違えないから消しゴムは要らないんですって。
kwatchさんが「箱」をイメージされるということは、 紙と鉛筆よりももっと新しいデバイスのイメージを持っておられるのでしょう。
というか、もうこうなったら初心者相手に実験するしか ないですね。
- 名札モデル
- 箱モデル
- IDを入れた箱モデル
初心者の選び方で全然違う結果が出そう。
C++について学ぶなら「箱+名札モデル」が良いと思います。 ポインタについて学ぶ時には「IDを入れた箱(+名札)モデル」ね。
しかし、今はRubyの話ですから、そんなもってまわった話をしなくても、 名札モデルで十分だと思います。
個人的にはRubyでlet x 100のような記法があれば 名札モデルの説明でしっくりくるのですが。 これなら、代入でなく命名、変数ではなくて名前 という用語で説明しやすい
えーと、なにか私の主張を誤解しておられるかもしれません。 私は「(Rubyにおける)変数とは結局は名前に過ぎない」と申しております。 ですから、「代入は命名、変数は名前」です。
ところで、Rubyって、複数の変数が同一の実体を指すこと無いのですか。参照渡しなんかも含めて。 複数の変数が同一の実体を指すことができると、それはそれで便利ですが、 Rubyではそうできなくなっている理由は何なのでしょう?
もちろんあります。ないのはC++のリファレンスに相当する「複数の名前で同じ変数を指すこと」です。
C++と比較するとRubyは一段少ないんです。
C++: 名前->箱->オブジェクト Ruby: 名前->オブジェクト
背景となる(言語が見せようとしている)モデルが違うんで、 同じモデルを使うことは良くないかも、というのが今回の話のもとなのです。
「名札」で違和感があるのは,「ary = Array.new」は「ある配列オブジェクトにaryという名前をつけた」ということですが,この「名前のないモノに名前をつける」ということが,あんまり日常では起きないからではないかとも思います。子供に名前をつけるときぐらい?
いや、プログラマの日常にはよくあるんじゃないですかね。
名前をつけることはもうすでに日常なのです。(笑)
いずれ曲がり角で出前の蕎麦屋にぶつかったりするんじゃないでしょうか。<マンガみたいな生活。
これからプログラマになろうかという人にとっては日常じゃなかったり @:)
まつもとさんの言われていることはその通りなのですが,プロジェクトやプログラムやモジュールやクラスやメソッドに名前をつけるときには「=」は使わないからなあ...というのがぼくの違和感の源です。屁理屈的に言えばクラスは「def Array..」で「Arrayという名前のクラスを作る」って感じなのに,「ary = Araay.new」ではその「感じ」がしないということです。
やっとはっきりしてきました。要するに私は「その<変数>は計算機様の扱う変数であって、俺様が(脳内で)相手をしてる変数じゃないやい!」というしょうもないことを言いたかったようです。ああはずかしいごめんなさい
> 途中結果は紙に書きなぐられた数または式です。これが
> 他のなにかとごっちゃにならないように名前をつけておく、
> というのが私の「数学の変数」に対するイメージですね。
なるほど、このイメージなら確かに「変数は名前」ですね。
> えーと、なにか私の主張を誤解しておられるかもしれません。
> 私は「(Rubyにおける)変数とは結局は名前に過ぎない」と
> 申しております。ですから、「代入は命名、変数は名前」です。
はい、その主張は理解しているつもりです。
ただ『代入は命名、変数は名前』というのは、Rubyの動作としては
わかるのですが、それだったら最初から「代入」や「変数」という
言葉を使うべきではないと思います。
つまり、最初から「Rubyには変数も代入もない。あるのは名前と
命名だけだ」という説明をする。
『代入は命名、変数は名前』という説明をするから自分は違和感を
感じてしまうし、x = 100 という書き方ではどうしても「代入」や
「変数」という言葉がでてきてしまうので let x 100 のほうが
よい、と思った次第です。
上のま2さんのコメントと通じるものがありますが、
let x 100 なら「変数」や「代入」という言葉は出てこずに、
自然と「名前」や「命名」という言葉がでてきませんか?
ただ、これは自分が箱モデルの頭をしているからですね。
箱モデルの頭だと
・「変数」のイメージ≠「名前」のイメージ
・かつ「代入」のイメージ≠「命名」のイメージ
ですが、まつもとさんのように『途中結果は紙に書きなぐられた
数または式です。これが他のなにかとごっちゃにならないように
名前をつけておく』という方なら、はなっから
・「変数」のイメージ=「名前」のイメージ
・かつ「代入」のイメージ=「命名」のイメージ
なので、何の違和感も感じないのでしょう。
#こんなに書き込むくらいなら日記つづけとけ >自分
#お忙しいところ失礼しました。
僕が思う名札モデルの素晴らしい点は,「変数の評価」のタイミングで悩まないですむところです。プログラミングを学びはじめたころ,「aってaそのものなのか,aに格納されている値なのか?」とかよく悩みました。a = 1; b = a; で「bの値はaではなく1である」つまりいつの間にか変数が評価されているというのが,よく理解できませんでした。これを名札モデルで考えるとすっきりと理解できますね。
個人的には「変数の評価」はかなり悩んだのですが(本格的に始めたのがLispだったからかも),世間的にはあまり問題視されていないようですね。
class Array〜とary = Array.new
は、それをする目的がぜんぜん違う。
目的が違えば手段は違っても不思議ではないと思う。
屁理屈的には
Rubyオブジェクトの実体ちゅーのはシュレディンガーの猫で
変数ってのは観測装置であって猫が入っている箱に何個でも設置できる、と。
で猫がどうなってるかは観測してみるまで
(メソッドの実行とかをしてみるまで)わかんない、
というシロモノと思えば万事OK。
Rubyオブジェクトであるという前提で考えられる範囲において
あらゆるオブジェクトが観測される可能性がある。
Rubyオブジェクトは可能性の世界に存在するのだな。
で、山田正紀的には可能性である平行世界を現実世界へと
牽引してしまうのが物語だと言っているわけだから
言い換えれば可能性である参照を実際のオブジェクトへと
牽引してしまうのがソースだと言ってるわけだ。
と勝手に解釈しました@エイダ読書中
名札であって名前じゃないというのがミソかも。