うたカモ技術ブログ

Lua

Luaプログラミング   文法まとめ その1(標準出力・if・for・while・関数)

post:     update: 

Luaプログラミングの個人的なTIPSを掲載します。

最近、Luaスクリプトを書くことが多いので、知識の整理のためにここに要点をメモします。 他のプログラミング・スクリプト言語とは異なる点や独特な書き方をする部分を中心に紹介します。

※なお、この記事は以下の環境で実施した結果を元に作成しています。

#実行環境OS
ubuntu 22.04 LTS 64bit
#Lua
Ver 5.4.4

目次

  1. コメント
  2. 標準出力
  3. 標準入力
  4. ファイル読み書き
  5. テーブル
  6. if文
  7. for文
  8. while文
  9. 関数

コメント

単一行コメント
先頭文字を「--」とすることで、単一行コメントが記述できます。
--単一行コメントの例です
複数行コメント
--[[コメント]]で複数行に跨るコメントが記述できます。
--[[
複数行コメントの例です。
コメント1
コメント2
コメント3
コメント4
コメント5
]]

標準出力

print
引数の文字列(string)の末尾に改行を入れて出力します。
for文などの繰り返し処理中で使用する場合はio.flushでバッファを吐き出すようにした方が 正常に出力されます。
print("こんにちは")
文字列連結は「..」です。
world = '世界'
print("こんにちは" .. world)
io.write(string)
引数の文字列(string)を出力します。末尾に改行は入りません。
for文などの繰り返し処理中で使用する場合はio.flushでバッファを吐き出すようにした方が 正常に出力されます。
io.write("こんにちは")

標準入力

io.read()
コンソールからの標準入力を受付け、変数に入力値を代入します。
io.write("入力してください:")
data = io.read()
print("入力値は" .. data .. "です。")

ファイルの読み書き

ファイル読み込み
読み込みモード("r")でファイルをオープンして、read関数でファイルデータを取得します。
ファイルデータを一括取得したい場合は"a"を指定して実行します。
file = io.open("test.txt", "r")
--[フォーマット指定] "n":数値読み込み,"a":全部読み込み,"l":行読み込み, "L":行読み込み(改行含む)
data = file:read("a")
print(data)
file:close()
1行ずつ読み込みたい場合はlines関数を使います。この場合、引数は"l"です。
※1文字ずつ読み込みたい場合は数値の1を指定します。
file = io.open("test.txt", "r")

cnt = 1
for line in file:lines("l") do
    print(cnt"行目:"line)
    cnt = cnt + 1
end

file:close()
ファイル書き込み
書き込みモード("w")でファイルをオープンして、write関数で指定文字列を書き込みます。
file = io.open("test.txt", "w")
file:write("こんにちは")
file:close()

テーブル

テーブル
他のプログラミング言語の配列と同様な扱いですが、キーが「1」から始まることには注意です。
--テーブル
array = {
    'リンゴ',
    'オレンジ',
    'バナナ'
}

print(array[1]) --リンゴ
print(array[2]) --オレンジ
print(array[3]) --バナナ

テーブル名の先頭に「#」を付けると、要素数を取得できます。
array = {
    'リンゴ',
    'オレンジ',
    'バナナ'
}

print('テーブルの要素数 = ' .. #array)

--処理結果
--テーブルの要素数 = 3
連想配列
キーと値のペアで構成されるテーブルです。
先頭要素を例に挙げれば、キーはapple、値は'リンゴ'です。
--連想配列
array = {
    apple = 'リンゴ',
    orange = 'オレンジ',
    banana = 'バナナ'
}

print(array['apple'])  --リンゴ
print(array['orange']) --オレンジ
print(array['banana']) --バナナ

ジャグ配列
多段階要素のテーブルです。Luaは複雑な構成のテーブルを作ることが出来ます。
--ジャグ配列
array = {
    apple = 'リンゴ',
    orange = 'オレンジ',
    banana = 'バナナ',

    coffee = {
        arabica = {
            bluemountain = 'ブルーマウンテン',
            guatemala = 'グアテマラ',
            hawaii_kona = 'ハワイコナ',
        },
        robusta = {
            vietnam = 'ベトナム',
            indonesia = 'インドネシア',
            ivory_coast = 'コートジボワール'
        }
    },

    vegetable = {
        'トマト',
        'ピーマン',
        'キュウリ'
    }
}

print(array[2]) --オレンジ
print(array['coffee']['arabica']['bluemountain']) --ブルーマウンテン
print(array['vegetable'][1]) --トマト

if文

if文は他のプログラミング言語同様に条件式を評価し、結果がtrueの場合、任意の式を実行します。 式はthenとendによって囲む必要があります。

--コンソールに'1'を入力したときに「Hit」と表示します。
io.write("input value:")
local value = io.read()

if value == '1' then
    print("Hit!")
end

if、else文の組み合わせは次のように書きます。

--コンソールに'1'を入力したときに「Hit:1」、'2'を入力したときは「Hit:2」、それ以外を入力したときは「Hit:other」を表示します。
io.write("input value:")
local value = io.read()

if value == '1' then
    print("Hit:1")
elseif value == '2' then
    print("Hit:2")
else
    print("Hit:other")
end

for文

基本的なfor文では、初期化、終了条件、変化式を指定して繰り返し処理を実行します。

for i = 1, 5, 1 do
    print(i)
end

--[[処理結果
1
2
3
4
5
]]

変化式を省略すると、1インクリメントが暗黙的に適用されます。

for i = 1, 5 do
    print(i)
end

--[[処理結果
1
2
3
4
5
]]

テーブルに対するfor文では、#テーブル名でテーブル長をインクリメントの最大値 とすることが出来ます。

coffee = {
    "ブルーマウンテン",
    "グアテマラ",
    "ハワイコナ"
}

for i = 1, #coffee do 
    print(coffee[i])
end

--[[処理結果
ブルーマウンテン
グアテマラ
ハワイコナ
]]

テーブルのイテレータとして、ipairs関数を使用することもできます。

coffee = {
    "ブルーマウンテン",
    "グアテマラ",
    "ハワイコナ"
}

for idx, val in ipairs(coffee) do 
    print("coffee[" .. idx .. "] = " .. val)
end

--[[処理結果
coffee[1] = ブルーマウンテン
coffee[2] = グアテマラ
coffee[3] = ハワイコナ
]]

また、pairs関数を使用すると、連想配列のキーと値のペアを返し、全ての要素にアクセスできます。

coffee = {
    bluemountain_coffee = "ブルーマウンテン",
    guatemala_coffee = "グアテマラ",
    hawaii_coffee = "ハワイコナ"
}

for key, val in pairs(coffee) do
    print(key .. " = " .. val)
end

--[[処理結果
bluemountain_coffee = ブルーマウンテン
guatemala_coffee = グアテマラ
hawaii_coffee = ハワイコナ
]]

while文

while文は、指定された条件がtrueの間、繰り返し処理を行います。以下は、変数cntが5以下の場合に繰り返されるwhileループの例です。

local cnt = 1
while cnt <= 5 do
    print("cnt = "..cnt)
    cnt = cnt + 1
end

上記のコードでは、変数cntが1から5になるまで繰り返し処理が行われます。処理結果は以下の通りです。

cnt = 1
cnt = 2
cnt = 3
cnt = 4
cnt = 5

whileループを終了するためには、指定された条件がfalseになるような処理を行う必要があります。

関数

Luaでは、関数定義にfunctionキーワードを使用します。 以下は、引数aとbを取り、それらを加算した結果を返すsum関数の定義例です。

function sum(a, b)
    return a + b
end

上記のように、関数定義の後には「end」を付ける必要があります。 また、定義した関数は以下のように呼び出すことができます。

local result = sum(10, 20)

この場合、result変数には30が格納されます。

関数を変数で参照することも可能です。以下は、変数sumから引数a、bを加算する関数を呼び出す例です。

local sum = function (a, b)
    return a + b
end

これにより、以後は変数sumから呼び出し可能です。

参考文献