第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 です