Skip to content

Instantly share code, notes, and snippets.

@o-gh
Last active June 30, 2020 19:26
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save o-gh/98035fcb7968cf64f39c236ecdb667d1 to your computer and use it in GitHub Desktop.
Save o-gh/98035fcb7968cf64f39c236ecdb667d1 to your computer and use it in GitHub Desktop.
Lua入門

Lua言語入門

Hello World

コードを書く

print("hello World!!\")

拡張子は.lua としてファイルを保存 例えばexample.luaとする

コマンドを入力し実行する

lua example.lua

コメント

一行コメント

--example

複数行コメント

--[[
example1
example2
]]

エスケープシークエンス

記号 内容
\n 改行
\a BEEP音
\t タブ
\b バックスペース
\' シングルクォーテーション
\" ダブルクォーテーション
\\ バックスラッシュ

引用符

エスケープシーケンスを特殊な文字として解釈する場合

print ("Hello World!\n")
print (’Hello World!\n’)
print "Hello World!\n"

エスケープシーケンスを特殊な文字として解釈しない場合

print ([[Hello World!\n]])

文字列の連結

..で文字列を連結できる

print ("Hello".."World!") -- HelloWorld!

変数

Luaは動的型付け言語であり変数自体には型を持たないが参照する値は型を持つ

変数の宣言

a = 10

複数の変数を宣言する場合

a = 10 b = 20

多重代入

a, b = 10, 20

nil型

a = nil

真偽型

a = true
b = false

条件式では nil と false の値のみが偽となり他のすべての値は真となる
つまり 空文字列 や 空テーブル や 0 などもすべて真となるので注意が必要

数値型

a = 10

文字列型

a = 'abc'

Luaは文字列と数値を実行時に自動的に変換する
すべての数学演算は、文字列に適用されると、一般的な変換ルールに基づいてその文字列を数値に変換しようとする
逆に、文字列が期待されるところで数値が使れると、その数値は一般的な形式の文字列に変換される

関数型

a =  function(b, c) return (b+c) end

テーブル型

配列型はなくテーブル型を使用する

tbl = {}
tbl[1] = "a" -- 要素1に代入
print( tbl[1] ) -- a

何も指定しなければ要素は0からではなく1から始まる

a = {"A", "B", "C", "D", "E"}
print( tbl[0] ) -- nil
print( tbl[1] ) -- A

要素を指定する場合

a = {[0]="X", [1]="A", [2]="B", [3]="C", [4]="D", [100]="E"}
print( tbl[0] ) -- X
print( tbl[1] ) -- A

テーブルは連想配列のように使うこともできる

a = {x=111, y=222, z=333}

上記と同じテーブル

a = {}
a['x'] = 111
a['y'] = 222
a['z'] = 333

print(a['x'])
print(a['y'])
print(a['z'])

ドット区切りにより連想配列を表現することも可能である

a = {}
a.x = 111
a.y = 222
a.z = 333

print(a.x)
print(a.y)
print(a.z)

スレッド型

スレッド 型は独立した実行のスレッドを表しコルーチンを実装するために使われる

ユーザーデータ型

ユーザーデータ 型は任意の C のデータを Lua の変数に格納するために使われる CとのAPIを通してのみ作成と変更が可能である

変数のスコープ

  • グローバル変数
    • プログラムのどこからでも使用可能
  • ローカル変数
    • スコープ内からのみ使用可能

明示的にlocal宣言されない変数は全てグローバル変数となる
例えば関数の中であってもlocal宣言しなければグローバル変数となる

v = 10 -- グローバル変数
function f(n)
    v = n
end
f(2)
print(v) -- 2
v = 10 -- グローバル変数
function f(n)
    local v -- ローカル変数
    v = n
end
f(2)
print(v) -- 10

レキシカルスコープ

ローカル変数はそのスコープ内部で定義された関数から自由にアクセスできる

function out()
   
   local x = 1
   
   local function inner1()
      x = x + 1
      print(x)
   end

   local function inner2()
      x = x + 1
      print(x)
   end
   
   inner1() -- 2
   inner2() -- 3
end

out()

ローカル変数のスコープはその宣言の後の最初の文から始まりその宣言を含む最も内側のブロックの無でない最後の文で終わる

x = 10                    -- グローバル変数
do                        -- 新しいブロック
    local x = x           -- 新しい 'x' 、 値は 10
    print(x)              -- 10
    x = x+1
    do                    -- 別のブロック
        local x = x+1     -- 別の 'x'
        print(x)          -- 12
    end
    print(x)              -- 11
end
print(x)                  -- 10  (グローバル変数)

関数

Lua の関数は全て無名関数であり
関数名は関数を保持する変数の名前である

f = function (n)
    print (n)
    return n
end

上記と同じ

function f(n)
    print (n)
    return n
end

引数の初期値は指定できないが 下記ように書くことで初期値の指定を実装可能である

function f(n)
    local n = n or 'abc' -- nが未指定の場合にabcが代入される
    return n
end

可変引数

function f(...)
    local n = {...}
    for i in pairs(n) do
        print(n[i])
    end
end

f("x", "a", "b", "c")

制御文

条件分岐

exp = 1
if exp == 0 then
     print("a")
elseif exp == 1 then 
     print("b")
else 
     print("c")
end

Luaにはswitch文はない

条件式がない場合、falseまたはnilであるば偽、それ以外は真と判定される

hoge = 1
if hoge then
   print("1")
end

hoge = 0
if hoge then
   print("2")
end

hoge = false
if hoge then
   print("3")
end

hoge = nil
if hoge then
   print("4")
end

比較には数値・文字列の変換は適用されない 下記の場合a == bは偽と判定される

a = 1
b = "1"
if a == b then
    print("a")
else
    print("b")
end

繰り返し

whileでは繰り返しの中身を実行するかどうかの条件判定を最初に行う

i = 0
while i <= 100 do --条件が真である場合繰り返される
    print(i)
    i = i + 1
end 

repeatでは繰り返しの中身を実行するかどうかの判定を最後に行う

i = 0
repeat
    print(i)
    i = i + 1
until i >= 100 --条件が偽である場合繰り返される

forは 初期値 終了値 増加値 をカンマで区切って指定する

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

増加値 を省略した場合増加値は1となる

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

繰り返しを抜ける

繰り返しを抜ける場合は break を使う
continue に相当するものはLuaには存在しない

i = 0
while i <= 100 do
    i = i + 1
    if i = 10 then
        break
    end
    print (i)
end

break はブロックの最後にしか書くことができない
例えばデバッグなどで任意の位置で break したい場合は do end を使用する

i = 0
while i <= 100 do
    i = i + 1
    do
        print (i)
        break
    end
end

ジェネリック(汎用)for

イテレータ関数 pairs ipairs を使うことでジェネリックforを実装できる

テーブルの中身をすべて表示する場合

t = {a = 10, b = 20, c = 30}
for k,v in pairs(t) do
    print(k.."="..v)
end

配列の中身をすべて表示する場合

t = {10, 20, 30}
for k,v in ipairs(t) do
    print(k.."="..v)
end

関係演算子

記号 内容
== 等しい
~= 等しくない
< より少ない
> より多い
<= より少ないか等しい
>= より多いか等しい

論理演算子

記号 内容
and かつ
or または
not でない

ブロック

do

end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment