第 2 回: Lua の便利なテープル型や文字列の操作について紹介する

コメントについて

comment.lua

1
2
3
4
5
6
7
8
-- 一行コメント
--[[
複数行のコメント 1
複数行のコメント 2
複数行のコメント 3
]]

print("コメントテスト")

comment.lua の実行結果は:

[wtopia lua.hajime]$ lua comment.lua
コメントテスト

文字列の表し方

[[...]] の間には, 改行を挟むこともできる.

[==[...]==] の間には [[どんなときも]] を出力できる.

specialstr.lua

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
print[[
we are the future.
[よい一日, 過ごそう.]
"\n"
"\a", "\b"
新宇体]]

print[==[
こんにちは.
[[どんなときも.]]
挨拶は重要です.]==]

specialstr.lua の実行結果は:

[wtopia lua.hajime]$ lua specialstr.lua
we are the future.
よい一日, 過ごそう.
新宇体

Lua で利用できる値の型

Lua で用意されているのは, 以下の8つの基本型:

nil
ブーリアン (真偽) -> boolean
数値 -> number
文字列 -> string
関数 -> function
テーブル -> table
スレッド -> thread
ユーザーデータ -> userdata

nil は C 言語の null にあたるもので, 初期化していない変数は, 値が nil になっている:

[wtopia lua.hajime]$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> local i
> =type(i)
nil
>

また, ブーリアン型は, true か false の真偽値を取る.

これらは, 基本関数 type() を使って確認できる.

type.lua

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
i = 50
print( type(i) ) -- number
print( type(43) ) -- number

s = "abcdefg"
print( type(s) ) -- string
print(type ("feifei") ) -- string

v = true
print ( type(v) ) -- boolean

add = function(a, b) return (a+b) end
print ( type(add) ) -- function

function sub(a, b)
   return (a-b)
end
print ( type(sub) ) --function

type.lua の実行結果は:

[wtopia lua.hajime]$ lua type.lua
number
number
string
string
boolean
function
function

文字列の操作でみる Lua

Lua で文字列を操作するには, string ライブラリを使う.

substr.lua

1
2
3
4
-- substr.lua
str = "abc%&8feifei`-*`"
name = string.sub(str, 7, 12)
print(name)

substr.lua の実行結果は:

[wtopia lua.hajime]$ lua substr.lua
feifei

string.sub() は, 文字列の部分文字列を取り出す関数.

上記のプログラムは文字列 str の 7 文字目kら 12 文字目までの部分文字列 feifei を抜き出す.

str_code.lua

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-- str_code.lua

s = "abcdefg"

for i = 1, string.len(s) do
   ch = string.sub(s, i, i)
   code = string.byte(s, i, i)
   fmt = string.format("[%s:%d:%#x]", ch, code, code)
   print(fmt)
end

str_code.lua の実行結果は:

[wtopia lua.hajime]$ lua str_code.lua
[a:97:0x61]
[b:98:0x62]
[c:99:0x63]
[d:100:0x64]
[e:101:0x65]
[f:102:0x66]
[g:103:0x67]

文字列をオブジェクト指向風に扱う方法

string.sub(s, 2, 4) をオブジェクト指向風に書くと:

s:sub(2, 4)

となる.

同様にして, string.len(“abc”) も:

s:len()

のように記述できる.

str_test.lua

1
2
3
4
5
6
7
8
9
-- str_test.lua
s = "abcdefg"
for i = 1, s:len(s) do
   ch = s:sub(i, i)
   code = s:byte(i, i)
   fmt = "[%s:%#x]"
   str = fmt:format(ch, code)
   print(str)
end

str_test.lua の実行結果は:

[wtopia lua.hajime]$ lua str_test.lua
[a:0x61]
[b:0x62]
[c:0x63]
[d:0x64]
[e:0x65]
[f:0x66]
[g:0x67]

テーブル型について

Lua には, 配列変数がなく, 代わりにテーブル型を利用する.

テーブル型を生成するには, テーブルコンストラクタを利用する:

tbl = {}
tbl[1] = "a" -- 要素 1 (先頭) に, "a" を代入
print( tbl[1] ) -- 要素 1 の値を参照する

table_test.lua

1
2
3
4
5
6
7
8
9
-- table_test.lua
tbl = {"A", "B", "C", "D", "E"}

print( tbl )
print( tbl[0] )

print( tbl[1] )
print( tbl[3] )
print( tbl[5] )

table_test.lua の実行結果は:

[wtopia lua.hajime]$ lua table_test.lua
table: 0x100106000
nil
A
C
E

tbl = {“A”, “B”, “C”, “D”, “E”} は以下のように書き換えても大丈夫:

tbl = {}
tal[1] = "A"
tal[1] = "B"
tal[1] = "C"
tal[1] = "D"
tal[1] = "E"

連想配列

テーブル型は, 配列変数のように使えるほかに, 連想配列としても利用できる.

連想配列とは, キーと値のペアでデータを保存できる機能のこと.

table_test2.lua

1
2
3
4
5
6
7
8
9
-- table_test2.lua
age = {}
age["feifei"] = 28
age["yangyang"] = 8
age["yangguang"] = 2
age["kankan"] = 1

print( age["feifei"] .. " 歳" )
print( age["kankan"] .. " 歳")

table_test2.lua の実行結果は:

[wtopia lua.hajime]$ lua table_test2.lua
28 歳
1 歳

上記のプログラムは, 下記のように書いても同じ意味になる:

age = {feifei=28, yangyang=8, yangguang=2, kankan=1}
print( age["feifei"] )
print( age["kankan"] )

table_test3.lua

1
2
3
4
5
-- table_test3.lua
age = {feifei=28, yangyang=8, yangguang=2, kankan=1} -- "" 付けないこと

print( age["feifei"] .. " 歳" )
print( age["kankan"] .. " 歳")

table_test3.lua の実行結果は:

[wtopia lua.hajime]$ lua table_test3.lua
28 歳
1 歳

以下のように配列の要素の番号を指定できるようになっている.

table_test4.lua

1
2
3
4
5
6
7
-- table_test4.lua
t = {[3] = "C", [2] = "D", [0] = "A", [1] = "F"}

print( t[0] )
print( t[1] )
print( t[2] )
print( t[3] )

table_test4.lua の実行結果は:

[wtopia lua.hajime]$ lua table_test4.lua
A
F
D
C

テーブルのキーと値を列挙する

pairs() 関数を利用する.

enum.lua

1
2
3
4
5
-- enum.lua
tbl = {zz = 25, ff=28, yy=8, gg=2, kk=1}
for key, val in pairs(tbl) do
   print(key, val)
end

enum.lua の実行結果は:

[wtopia lua.hajime]$ lua enum.lua
zz    25
ff    28
yy    8
gg    2
kk    1