66
70

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Lua言語を触ってみた

Last updated at Posted at 2017-02-08

普段は、Pythonを書いたり、JavaScriptを書いたりしています。が、とある業務でLuaという言語を触ることになったので、勉強してみました。

取り扱う内容

  • Lua言語とはどういうものか?
  • サンプルコード(ランダム文字列の生成)

どういう言語か?

手続き型のプログラミング言語でスクリプト言語です。

Lua(ルア)と読みます。

作者

リオデジャネイロ・カトリカ大学の情報工学科の方々です。

どういう目的のために作られたのか?

Luaは、C言語のホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。

参考wiki

どういう使われ方をしているのか?

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を実行できます。

66
70
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
70

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?