第3章 変数について

何か計算をしたとき,その計算結果を覚えておきたいときがあると思います.

その時使うものが変数です.変数とは,値を保存することができる箱です.

変数の型について

LuaにはC言語のような変数の型は一応存在してはいますが, 変数の型を意識しなくてもよいような設計となっています.

例えば hoge という名前の変数を宣言したら,その変数にはどんな値でも代入できます.

整数も代入できますし,少数や文字列なども代入できます.

ここで代入とは変数つまり箱の中に値を入れることです(この表現は正確ではないですが, いまの段階ではそう思っていただいてかまいません).

変数の作り方

では,実際に変数を作ってみましょう. 変数を作りたい場合,次のようにします.

hoge = 10
これは,hogeという名前の変数を作れという意味です.
箱には名前をつけることができます. そしてこのhogeには10という値が入っています. C言語とは違って初期化していない変数は作ることができません. 例えば次のようなコードはエラーとなります.
hoge --error

変数を複数宣言する場合は次のように記述することもできます.

foo = 10 bar = 20

上記の宣言は

foo = 10
bar = 20

と全く同じ意味になります. また,

foo, bar = 10, 20

も同じ意味となります.

C言語とは違い,変数はどこでも宣言できます. また,複数の値を1行で書き換える多重代入が可能です.

また,これも重要ですが,Luaの変数は特に指定が無い限りグローバル変数となります. グローバル変数の意味は変数のスコープの所で説明します.

変数命名の際の注意

変数名を付ける際に,次のようなルールがあります.

  • 先頭は英字か``_``(アンダースコア)でなければならない

    数字ではダメです

  • 同じ名前の変数が2つ存在する事は基本的にはできない

    ただし変数のスコープが違えば同じ名前の変数を複数つくれます. スコープの説明は今はしません.

  • 予約語は使えない

    予約語(表3.3)とは,if やwhile など,Lua 言語の文法の一部の事です.

Table3.3:

予約語一覧
and
break
do
else
elseif
end
false
for
function
if
in
local
nil
not
or
repeat
return
then
true
until
while

変数への値の代入

変数に何か値を入れてみましょう. 例えば,10という値を箱に入れたい場合は次のようにします.

hoge = 10

この = という記号は,式の右側の値を左側に代入せよ,という意味です. 数学のイコールという意味ではないので注意してください.

では,数学でよくある x = 10(xは10である)といった本当にイコールの意味を使いたい場合は どうすればよいでしょうか. これは,if文という所でしっかり説明しますが, 今軽く説明しておくと,== という記号を使います. イコールを二つ繋げて書くと,数学でいうイコールの意味になります.

Luaでは多重代入も可能となっています.

hoge, piyo = 10, 5

hogeに10を代入し,piyoには5を代入しています.

変数の値を表示する

変数を画面上に出力したい場合,どのようにしたらよいでしょうか. 例として,int型のhogeという箱に10という値を代入して,その箱の中身を画面上に表示させてみます.

hoge = 10
print(hoge)

このプログラムを実行すると,次のように画面上に表示されると思います.

実行結果

10

複数の値を表示させることもできます.

hoge = 10
piyo = 20
print(hoge, piyo)

このようにカンマ区切りで複数の値が表示できます.

また文字と数値なども一緒に表示させることができます.文字列と数値,または文字列と文字列を結合して表示させる場合,連結演算子.. を使います.

LuaにはC言語のprintf関数と似たものが存在します. それがstring.format()関数です.

この関数は文字列の書式を指定して画面に表示します.書式指定子一覧は表3.2 の通りです.

Table3.2:

書式指定子  
記号 意味
%d 整数の10進法として出力
%u 符号なし整数の10進法として出力
%o 整数の8進法として出力
%x 整数の16進法として出力
%f 小数点表示
%c 1文字出力
%% %を出力

string.format() 関数を使って数値を表示させてみましょう.

hoge = 10
print( string.format( "hoge の10 進数の値は%d です" ,hoge) )
print( "hoge の16 進数の値は" ..
string.format("%x",hoge) .. "です")

実行結果

hoge の10 進数の値は10 です
hoge の16 進数の値はa です

他にもいろいろ試して見ましょう.

hoge = 10
piyo = 20
foo = 30.256
print( string.format("hoge の値は%d です",hoge) )
print( string.format("piyo の値は%d です",piyo) )
print( string.format("値は%d です", 50) )
print( string.format("hoge は%d piyo は%d です",hoge,piyo) )
print( string.format("foo の値は%f です",foo) )
print( string.format("hoge の値は%f です",hoge) )
print( string.format("foo の値は%d です",foo) )

実行結果

hoge の値は10 です
piyo の値は20 です
値は50 です
hoge は10 piyo は20 です
foo の値は30.256000 です
hoge の値は10.000000 です
foo の値は30 です

演算

四則演算

数学でもお馴染みの四則演算,つまり「足し算」「引き算」「掛け算」「割り算」を Lua言語でも行うことができます.

Table3.3:

四則演算  
記号 意味
足し算
引き算
* 掛け算
/ 割り算

簡単な計算の例

x = 10
y = 20
print("x+y は" .. x + y .. "です")
y = y - x
print("y の値は" .. y .. "です")

このプログラムの実行結果は次のようになります.

実行結果

x+y は30 です
y の値は10 です

その他の演算

値の符号の反転をしたい場合は次のようにします.

x = 10
print("反転した値は" .. -x .. "です")

実行結果

反転した値は -10 です

剰余,つまり割り算の余りを求めたい場合は,次のようにします.

x = 10 y = 3
print("余りは" .. x % y .. "です")

実行結果

余りは1です

べき乗の計算

べき乗とは,例えばxの2乗,つまりx*xなどのことをいいます. Luaでべき乗の計算をしたい場合,`` 2^3 `` と ^ を使って表現します. `` 2^3`` は2の3乗という意味です.

print( "2の3乗は " .. 2 ^ 3 .. "です")

実行結果

2の3乗は8です

動的な変数の型

Luaは変数の型を意識しなくてもよいと説明しました. しかし一応変数の型は存在しています. それは表3.7 に示した8 つの基本型です.

Table3.7: 変数の型

*型* *意味*
nil nil
boolean 論理型
number 数値
string 文字列
function 関数
userdata ユーザ定義型
thread スレッド
table テーブル

nilとは何もない値という意味です.C言語やJAVAでいうnullと同じ意味です.

booleanは論理型,つまりtrueとfalseの二つの値を持つものです.

numberは数値を入れることができるものです.

stringが文字列を表しています.その他の型については現時点では説明しません.

Luaの場合は変数が型を持っているわけではなく,値が型を持っています.

つまり,変数に入れる値によって型が動的に変化していくわけです. ここで現在変数が何型であるかを調べるため type() 関数を使用して,型を調べてみましょう.

hoge = nil
print("hoge の現在の型は" .. type(hoge) .. "です")
hoge = "Hello"
print("hoge の現在の型は" .. type(hoge) .. "です")
hoge = 33
print("hoge の現在の型は" .. type(hoge) .. "です")
hoge = true
print("hoge の現在の型は" .. type(hoge) .. "です")

実行結果

hoge の現在の型はnil です
hoge の現在の型はstring です
hoge の現在の型はnumber です
hoge の現在の型はboolean です

このように入れる値によって型が動的に変化します.

例題

メートルをフィートへ変換するプログラム

メートルからフィートへ変換するプログラムを作成せよ. メートルに3.2 をかけることによってフィートを求めることができる.

io.write("メートルの値を入力してください:")
meter = io.read()
answer = meter * 3.2
print( meter .. "メートルは" .. answer .. "フィートです")

io.write()関数はprint関数と使い方は同じです.ただしio.write()関数は文章の最後に改行が自動付加されません.

実行結果

メートルの値を入力してください:27
27 メートルは86.4 フィートです

2つの値を交換するプログラム

変数hoge には10 が,piyo には5 が代入されている.この二つの値を交換せよ.

hoge, piyo = 10, 5
print("hoge の値は" .. hoge .. " piyo の値は" .. piyo .. "です")
tmp = hoge
hoge = piyo
piyo = tmp
print("hoge の値は" .. hoge .. " piyo の値は" .. piyo .. "です")

解答は一通りではありません.多重代入を使う事でtmp変数を使わなくて済みます.

hoge, piyo = 10, 5
print("hoge の値は" .. hoge .. " piyo の値は" .. piyo .. "です")
hoge, piyo = piyo, hoge
print("hoge の値は" .. hoge .. " piyo の値は" .. piyo .. "です")

実行結果

hoge の値は10 piyo の値は5 です
hoge の値は5 piyo の値は10 です