さてさて、今回はどこから始めるべきか・・・



テーブル

まぁ変数関連の続きってことでこれからかな
前回、後で書くよ〜って言ったテーブルについて
C言語とかだと配列って呼んだりするんだけど、テーブルってのは大雑把に言えば型のところで説明した通り
好きな数の箱を紐を通してひとくくりにした感じ
イメージ的にはこんな感じ?
table{□-□-□-□-□}
      t1 t2 t3 t4 t5
む〜・・・説明がむずいわっw
この例だと、t1〜t5っていう5個の変数がtableっていう名前の一つのテーブルにまとめられてるってことだね〜
ROのセル座標に例えるとわかりやすいかなぁ・・・?
この例で言うと、Y座標がtable軸の左端1セル目がt1、2セル目がt2・・・みたいな
うぅ・・・これで理解できるだろうか?;
えーっとまぁそういうことだ、がんばれ!(死滅

さて、ここで、変数としての機能を持っているのはtableではなくてt1〜t5なわけだから
x = table
と書いてもt1〜t5どれかの中身を代入はできない
じゃあ別個の中身が欲しいときはどうするの?ってーと
答えはこう書く
x = table[1]
これでtable軸の中の1番目、つまり上の例でいうt1の中身がxに代入されるわけだ
同じようにt2の中身が欲しければtable[2]って書けばいいし以下同じでtable[3]、table[4]・・・と書けばそれぞれの中身が見られる
ちなみにこの、テーブル内の各々の変数(この場合はt1〜t5)をそのテーブルの要素って言って、まとめられた変数の数(この場合5)を要素数って言って、テーブルの何番目かを表す[]の中の数字を添字って言ったりする
Luaの場合添字は基本的には1からスタートして増えていく整数順
・・・基本的には(何
でまぁ、テーブルを使いたいときには、ただ単純に変数宣言してもダメなんだよね
テーブルを新しく作るためには
t={}
と書く
これでこのtという変数は1つのテーブルですよっと宣言されるわけだ
ちなみにこのとき{}の中にコンマかセミコロンで区切って入れておきたい値を並べると、最初からその値が書いた順番に並べられた状態でテーブルを初期化できる
この初期化の方法ってのがいくつかあってですね・・・
ちょいややこしくなるけど例を見てこうか
a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
・・・はい
さ〜一気に意味不明になってまいりました(死
まぁ1個1個見ていこうか・・・w
まずa={(ry)}でaをテーブルとして宣言した・・・ところまではいい
問題の{}の中身
1個目
[f(1)] = g
しょっぱなから非常にめんどくさいのがきましたw(滅
これどういうことか
まず、
[値1] = 値2
って書き方は、テーブルの「値1」番目つまりこの例だとa[値1]に値2を代入、ってことなんだよね
んじゃf(1)は?
この書き方覚えてるかなぁ?
うん、そう、これ2回目で書いた関数呼び出しの方法なんだわ
つまり、引数に1を渡してfという関数を呼び出していることになる
要するに、結果としてgは何処に入るのかというと
「f(1)の戻り値」番目に入る、と・・・うん、ややこしいね
復習もかねてもち〜っと具体的に
仮に、
function f (x) y=x+10; return y; end
と定義して、
Answer = f(1)
と書けばAnswerには1+10が計算されて11が入ってくるわけだ
そしてこの[f(1)]=gって書き方は[Answer]=gと一緒
つまりこの例でいくならgの中身はa[11]に代入されるわけですな
あぁややこしい
さて次だ
2つまとめていこう
"x", "y"
さっき言ったとおり、コンマは単なる区切り記号
つまり"x"と"y"の2つの文字列をどこかに代入してるわけだが、1個めみたいに代入先が=で示されているわけじゃない
さぁではどこに代入されるのか
答えはa[1]から順番に放り込まれていきます
つまりこの例だとa[1]に文字列"x"が、a[2]に文字列"y"が入ることになる
ちなみに、
[1] = "x", "y", "z"
と並んでたら?まずa[1]に"x"が普通に入るんだけど、代入先を示さないこの書き方は、代入先に何か既に入っていないかどうかはチェックしない
ということは、a[1]に入った"x"は次の"y"で上書きされちゃうわけですね
でもってそのまま次のa[2]に"z"が入ると
こっれもややっこしいルールよねぇ・・・まぁプログラム組んでればそのうち慣れるw
4個目
x = 1
さぁこれもまたややこしいのがきたぞーw
一見してこれも1個目と同じで「xの中身」番目に1が入る?
いいえ違います
じゃあどうなるかってーと、文字列"x"番目・・・つまり
a["x"]
ってのが作成されます
え?添字って1から始まる整数順じゃないのかって?
困ったことに(?)全く問題ないんだなこれが・・・
だからやろうと思えばa["a"]なんて要素も作れてしまうわけだが
まぁそんなくそややこしいことをわざわざ自分でやる人もいないっしょw
さぁ次いこうか
f(x)
これはまぁまだわかりやすいほうかな
2個目3個目と一緒で、代入先が示されてないけど、2個目3個目でa[1]とa[2]には既に値を入れたという情報は保持されているのでa[1]ではなくa[3]に値が入る
中身の値は関数fにxの中身を渡したときの戻り値が代入されることになると
ちなみにここでもし関数fの戻り値が2個以上あったときは?
その場合、最初の1個だけがやっぱり普通にa[3]に入っておしまい
fのreturn文がreturn x,y,z;だったら、xだけがa[3]に代入されてyとzの中身は代入されないまま消滅ってことね

[30] = 23
これが一番単純だねぇ
代入先が示されてるし、入るものも単純な数値
見たまんま、a[30]に23が代入されるだけ
ラスト
45
これもそのまんま
代入先の示されてない方式だけどもうここまでくればどうなるかわかるよねぇ?
a[4]に45が代入されるだけだNE
簡単簡単w
っと、こんなところかなぁ
ここで1つ注意点というか例外というか・・・
今回の例で、最後の値が45じゃなくてf(x)だった時、f(x)の戻り値が2つ以上あったらどうなるか
これは、例えばreturn文が、return x,y,z;だったら、4個目のときみたいにxだけが代入されるんじゃなくて、xがa[4]に、yがa[5]に、zがa[6]に、と返ってきた値全部が順番に格納されることになる
これが嫌で、5個目のときみたいに最初の戻り値しか要らない!ってときは
(f(x))
と関数全体を()でくくってやればおk

代入について

なんかここまで普通〜に数学感覚で代入代入言ってきちゃったし、実際これも数学のと大方変わりないんだがw
あ〜、数学とは違うルールが1つ
代入は必ず右辺から左辺に行われるってこと
つまるところ・・・
1 = a
って書いちゃうと、定数であるはずの「1」に変数aの中身を代入しているということになってしまってエラーになる
まー数学でもこういう式になる場合普通は代入される側を左辺に持ってきて
a = 1
って書くだろうから問題ないっちゃないんだろうけど・・・w
それはともかく
あ、そうそう、代入する側には式を書くこともできる
a = i + 1
みたいにね
この場合はiの中身に1を足した結果がaに代入されることになるかな
他にも、関数のところでちょろっと言ったけど、
f = function 〜 end
って感じに関数だって代入できるし、
t = {}
a = t
って感じに、テーブルそのものだって代入できる
ちなみにテーブルそのものを代入すると、a[1]の中身はt[1]がコピーされてくるわけではない
この例のa=tで一体何が行われているのかというと、わかりやすく言うなら、コピペじゃなくて単なるショートカットの作成だったりする
だから、この例の後でaの中身をどこか変更するとtの中身も同じように変わることになる
この、「コピペ」を値渡し、「ショートカットの作成」を参照渡しって呼ぶんだけど・・・
ここでそれを詳しく書くと長くなっちゃうし、多分現段階で書いてもあんまり理解できないと思う・・・w
のでまぁ今日のところは機会があったらいつかしっかり書きますってことで・・・w

ってなわけでもう1つ、これはLuaの特殊ルール

多重代入

うん、まぁまずは例を挙げよう
Luaではこんな書き方がOKだったりする
x,y = 1,2
さぁどうなってしまうのか
答えは簡単、単純にコンマで区切られたとおりにxに1、yに2が代入されます
つまり、
x = 1
y = 2
と2行必要なところを、↑の1行で済ませられるわけだ
便利だねぇ〜
さてここで、このルールが許される以上、こういう書き方も出来てしまうわけだが
例1 x,y = 1,2,3,4
例2 a,b,c,d = 5
これは一体どうなるのか?
前者の場合は、ふつーにxに1、yに2が代入されてそれでおしまい
3と4は何処にも代入されず消滅する
後者の場合は、aに5が代入されて、残りb、c、dはnil・・・つまり空箱ってことになる
さてもう1つ別のパターン
i = 3
i,a[i] = i + 1,20
この場合は・・・というと
まず、先にi=3だからiの中身は3になる
で次の式でiとa[i]にi+1と20をそれぞれ代入してるわけだが
ここで問題、20は一体何処に代入されるでしょう?
答えはa[4]・・・ではなくa[3]です
今回の場合で言うと、もし先にi=i+1の代入をやって、その後からa[i]のiっていくつ?と聞かれればiは既に+1されて4になってるんだからa[i]=20はa[4]に20が代入されるわけだが
Luaの場合、一旦全ての式を確定させて、それから値を代入することになっている
だからまず先に、a[i]のiっていくつ?って聞いてくるわけですね
当然この時点ではまだiは3のままなのでa[i]はa[3]ですよっとなるわけだ
んでそれから順に代入されて、iはi+1で4になるけどa[i]のiは既に3ですよって言われてるんだからa[3]に20が代入される、と
この仕様のおかげで、Luaの場合
x,y = y,x
って書くだけでxとyの中身を入れ替えるということが出来たりする
いや〜、便利便利(萌え
他のC系の言語って先に代入からやっちゃうからこうは入れ替えられないんだよね〜、地味にめどいんだわ〜w
まぁそんな話はどうでもいいやw

さって、第3回はこんなとこでいいかな
次回もまたややこしくなりそうだけどまぁがんばろーノシ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

Menu

test

管理人/副管理人のみ編集できます