Lua の復習とかしてみる その 3
3.1
関数呼び出しの話。
特に書くことなし。
3.2
関数の定義の仕方。
function という予約語を使うみたい。下は受け取った配列の合計を計算する関数。
function goukei(array) sum = 0 for i = 1, table.getn(array) do sum = sum + array[i] end return sum end
3.3
ローカル変数の話。
Lua は関数定義の中で作った変数がグローバル変数になるらしい。恐ろしい。
だから関数外部からアクセスできないようにするためには local という記憶域クラス指定子っぽい物を付ける必要がある。
だから上の関数の定義をより安全に書くためには下みたいな感じ?
function goukei(array) local sum = 0 for i = 1, table.getn(array) do sum = sum + array[i] end return sum end
これで外部から sum に直接アクセスできないようになった。確認した。
3.4
文字列の処理の話。
連結演算子なんてのがあるらしい。なんで演算子になってるんだろ。関数で良くね?
a = "foo" b = "bar" c = a .. b print(c)
まだまだあるよ、string の関数。
test = "foo bar hoge hage" print("元の文字列 : " .. test) result = string.sub(test, 3, 7) -- 切り出し print("3 〜 7 文字目 : " .. result) istart, iend = string.find(test, "hoge") -- hoge の開始位置と終了位置のインデックスを返す print("hoge の位置 : " .. istart, iend) result = string.upper(test) -- upper ですね print("大文字に変換 : " .. result)
他にもまだまだいっぱいあるけど、今はさすがに書かないよ。
あとで出てくるよ。
3.5
文字列の書式の話。
string.format() というのを使う。ほぼ C の printf と一緒の書式。
4.1
3.4, 3.5 に引き続き、文字列ライブラリの話。
ここは主に検索と置換かな。
string.gmatch() って関数はイテレータ関数らしい。
他の関数の話も出てきた。
小さな言語と言っても、文字列処理の関数の有名どころはだいたい揃ってるみたい。
文字コードの話も出てきた。
string.find() が出てきたときも思ったけど、複数の返り値を返せるのが面白いね。
エスケープシーケンスの話も出てきた。この節は話題が広いな。
エスケープシーケンスは他の言語とだいたい一緒だね。
と思ったら、ヌル文字は解釈されずにそのまま出力するらしい。
やってみよう。
test = 'hoge\0hage' istart, iend = string.find(test,"hage") print(istart, iend)
結果
% lua escape.lua 6 9
確かにヌル文字のあとの文字も扱えてるな。
普通に print すると途切れちゃうみたいだけど。
4.2
みんな大好き正規表現のお時間がやってまいりました!まぁサラッと通過しますけどね。
一つだけ気になる点がある。
なんでメタ文字のエスケープが % なんだろ。 \ だと何か問題あるのか?
この仕様は気になるなー。あとでもうちょっと調べてみよう。
4.3
文字列のキャプチャの話。
キャプチャってなんだ、と思ったら、
パターンにマッチした文字列の一部分を後で利用できるように保存しておくことです。
ってことらしい。
ほぼサンプルのまんまのコードが下。
string = "no. AB1234 is now available." captcha = string.gsub(string, "(AB)(%d+)", "%1-%1-<%2>") print(captcha)
4.4
単語の切り出しの話。
クロージャktkr!
写経するのにちょうど良い長さなので写経した。
4.5
強制変換の話。英語で書くと coercion らしい。
数値と文字列の間のキャストだね。
4.6
テーブル操作ライブラリの話。
これも文字列ライブラリ同様、基本的な関数は揃ってるっぽい。
ちゃんと table.foreach() があるあたりに安心感を覚えた。
4.7
Lua の入出力ライブラリは、 C の stdio の拡張らしい。ラッパー?
io.input(filename) で入力ファイルとのストリームを開く、 io.read() で 1 行読み込み、io.input() でストリームを閉じる。
出力操作も似たような感じ。
read も write も改行文字は含まないのか。自分で連結してやる必要があると。
io.open(filename, mode) で C の fopen みたいな使い方が出来る。このときのデータ読み込みは file-handle:read(formats) ってので指定してやる。file-handle の部分は変数。メソッド呼び出しみたいな感じだね。
4.8
数値計算ライブラリの話。このライブラリも良く使う関数は揃ってる。
4.9
OS ライブラリ。 OS の機能を Lua から使うときに呼び出す関数群。
os.time() とか。
4.10
標準ライブラリを使った大きめのサンプル。
特に問題ないかな。
というわけで第 1 部完。