普段は、Pythonを書いたり、JavaScriptを書いたりしています。が、とある業務でLuaという言語を触ることになったので、勉強してみました。
取り扱う内容
- Lua言語とはどういうものか?
- サンプルコード(ランダム文字列の生成)
どういう言語か?
手続き型のプログラミング言語でスクリプト言語です。
Lua(ルア)と読みます。
作者
リオデジャネイロ・カトリカ大学の情報工学科の方々です。
どういう目的のために作られたのか?
Luaは、C言語のホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。
どういう使われ方をしているのか?
nginxの拡張モジュールでngx_luaというのがあります。これを使うとnginxのモジュールをLuaで記述できるようになります。。
どういう特徴を持つか?
- 実行速度が速い(ネイティブコードにコンパイルする処理系にはかなわないが(cとかVMを持たない言語)、バイトコードにコンパイルする)
- coroutineがある
実行環境は?
Luaはバイトコードにコンパイルされ、実行されます。
コンパイラとしては本家のLuaインタプリタとLuaJITというのがあります。
LuaJITというのはJITを搭載したもので、実行速度が劇的に速くなるようです。
これは、プログラム実行時に機械語へのコンパイルを行っているためです。
REPLはあるか?
あります。
$ lua
というコマンドを実行することでREPLが始まります。
試しに書いてみた
今回作るもの
任意の文字数の文字列をランダムに生成する関数を作ります。
生成させる文字列としては、半角英字の大文字と小文字、数字を含むものとします。
以下に関数となるコードを示します。
function CreateRandStr(length)
local length = length or 0
if length <= 0 then
return nil
end
local random_strs = {}
if length > 0 then
math.randomseed(os.time())
for i= 1, length do
local a = math.random(97,122) -- a~zのどれかを指定する数字
local c = math.random(65,90) -- A~Zのどれかを指定する数字
local i = math.random(48,57) -- 0~9のどれかを指定する数字
local w = math.random(1,3) -- 大文字、小文字、数字を決めるランダム値
if w == 1 then table.insert(random_strs, string.char(a)) end
if w == 2 then table.insert(random_strs, string.char(c)) end
if w == 3 then table.insert(random_strs, string.char(i)) end
end
end
-- 文字列に変換して、戻り値とする。
return table.concat(random_strs, "")
end
実行
CreateRandStr(10) -- => 10文字のランダム文字列が生成されます。
コードの解説
関数の定義
まず関数の定義は以下のように行います。hogehogeという関数ができます。
function hogehoge()
-- 処理
end
変数の初期化
変数は、定義時にデフォルト値を設定することができます。
下のコードでは、lengthという引数に値があれば、それを関数内のローカル変数として利用し、なければ、0をデフォルト値として利用します。
function CreateRandStr(length)
local length = length or 0
-- 以下処理
end
ランダムに数値を返す書き方
以下のように記述することで、1~100までの数値がランダムに取得できます。
math.randomseed(os.time())
math.random(1,100)
ランダムに英数字を返す書き方
こちらのページを利用しました。Luaでは文字列の内部コードはASCIIとなっているようです。
文字を生成するには、
string.char( <ASCIIの番号> )
というライブラリ関数を利用します。参考
上記の「ランダムに数値を返す書き方」を利用すると
半角英字(大文字)
string.char(math.random(65,90))
半角英字(小文字)
string.char(math.random(97,122))
半角数字
string.char(math.random(48,57))
と書くことできます。(実際のサンプルコードでは、変数を介してます。)
配列の利用
ランダムで1文字ずつ作った文字を、一度配列に格納してます。
Luaでは配列のようなコレクションオブジェクトを「テーブル」と呼びます。
random_strs = {}
table.insert(random_strs, "a") -- random_strsに"a"という文字を格納。
table.insert(random_strs, "3") -- random_strsに"3"という文字を格納。
-- random_strsは{"a", "3"}という結果になる
配列を文字列化する
random_strs = {"a", "3"}
table.concat(random_strs, "") -- => "a3"という文字列になる。
おまけ
以下のサイトで、WebブラウザからLuaを実行できます。