Lua_ 第2章タイプと値

5245 ワード

第2章タイプと値
Luaは動的タイプ言語であり、変数はタイプ定義しない.Luaには、nil、boolean、number、string、userdata、function、thread、tableの8つの基本タイプがあります.関数typeは、与えられた変数または値のタイプをテストできます.
 
print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

変数には事前定義されたタイプがなく、各変数にはいずれかのタイプの値が含まれる場合があります.
 
print(type(a))    --> nil   ('a' is notinitialized)
a = 10
print(type(a))    --> number a = "a string!!" print(type(a))    --> string
a = print         -- yes,this is valid!
a(type(a))        --> function

上の最後の2行に注意して、functionを使用して他の値を使用するように使用することができます(詳細は6章を参照).一般的に同じ変数が異なるタイプの値を表すと混乱するので、使わないほうがいいですが、特にnilなどの便利さをもたらすことができます.
 Nil
Luaの特殊なタイプで、彼は1つの値しかありません:nil;グローバル変数が割り当てられていない前のデフォルト値はnilです.グローバル変数負nilに変数を削除します. 
Booleans
2つの値falseとtrueを取ります.ただし、Luaのすべての値が条件として使用できることに注意してください.制御構造の条件ではfalseとnilが偽である以外は真である.だからLuaは0も空串も本当だと思っています.
Numbers
実数を表し、Luaには整数はありません.CPU演算浮動小数点数が整数より遅いという誤った見方が一般的である.実際にはそうではありません.整数の代わりに実数を使うと誤差はありません(数値が1000000000000を超えない限り).Luaのnumbersは誤差を心配することなく任意の長い整数を処理することができる.Luaをコンパイルするときにnumbersの代わりにロングまたはシングル精度の浮動小数点型を使用することもできます.プラットフォームハードウェアで浮動小数点数がサポートされていない場合、この特性は非常に役立ちます.具体的にはLuaリリース版に添付されている詳細を参照してください.他の言語と同様に、数値定数の小数部と指数部はオプションで、数値定数の例は次のとおりです.
4      0.4    4.57e-3       0.3e12     5e+20
Strings
文字のシーケンスを指します.luaは8ビットバイトなので、文字列には埋め込まれた0を含む任意の数値文字を含めることができます.これは、任意のバイナリデータを文字列に格納できることを意味します.Luaの文字列は変更できません.新しい変数を作成して、次のように文字列を保存できます.
 
a = "one string"
b =string.gsub(a, "one", "another")   --change string parts
print(a)          --> one string
print(b)          --> another string

stringは他のオブジェクトと同様に、Luaは自動的にメモリの割り当てと解放を行い、1つのstringは1文字だけを含んでも1冊の本を含んでもよく、Luaは長い文字列を効率的に処理することができ、1 MのstringはLuaではよく見られる.文字列は、一重引用符または二重引用符で表すことができます.
a = "a line"
b = 'another line'
スタイルを統一するには、2つの引用符がネストされていない限り、1つを使用することが望ましい.文字列に引用符が含まれている場合は、エスケープ記号を使用して表すこともできます.Luaのエスケープシーケンスは次のとおりです.
 
\a bell
\b backspace               --  
\fform feed                --  

newline -- \rcarriage return -- \thorizontal tab -- \v verticaltab \\ backslash -- "\" \" doublequote -- \'single quote -- \[ leftsquare bracket -- \]right square bracket --

例:
 
>print("one line
next line
\"inquotes\", 'in quotes'") one line next line "in quotes", 'in quotes' >print('a backslash inside quotes: \'\\\'')a backslash inside quotes: '\' >print("a simplerway: '\\'") a simpler way:'\'

文字列には、dddCdddを3桁の10進数とする)方式でアルファベットを表すこともできます.「alo 123」「97 lo1004923」と同じです.[[...]]も使用できます.文字列を表します.この形式の文字列は、複数の行を含んでもよく、ネストされてもよく、ネストされていなくてもよい.
エスケープシーケンスを説明します.最初の文字が改行である場合、自動的に無視されます.この形式の文字列は
コードのセグメントは非常に便利です.
 
page = [[
<HTML>
<HEAD>
<TITLE>An HTMLPage</TITLE>
</HEAD>
<BODY>
Lua
[[a textbetween double brackets]]
</BODY>
</HTML>
]]
 
 
io.write(page)

実行すると、Luaはstringとnumbersの間で自動的にタイプ変換を行い、文字列が算術オペレータを使用するとstringは数値に変換されます.
 
print("10" + 1)             --> 11
print("10 + 1")             --> 10 + 1
print("-5.3e - 10"* "2")   --> -1.06e-09
print("hello" + 1)          -- ERROR(cannot convert"hello")

逆に、Luaがstringを望んで数字にぶつかると、数字はstringに変わります.
print(10 .. 20)      -->1020

..Luaでは文字列コネクタで、1つの数字の後ろに書くと..の場合は、解釈の間違いを防ぐためにスペースを付けなければなりません.
文字列と数字は自動的に変換できますが、両者は異なり、10==「10」のような比較は永遠です.
すべて間違っています.stringを明示的に数値に変換する必要がある場合は、関数tonumber()を使用し、stringが正しい数値でない場合はnilを返します.
 
line =io.read()         -- read a line
n =tonumber(line)       -- try to convertit to a number
if n == nil then
error(line .. " is not avalid number")
else
print(n*2)
end

逆に、tostring()を呼び出して数字を文字列に変換することができます.この変換は常に有効です.
print(tostring(10) == "10")     --> true
print(10 .. "" == "10")         --> true

Functions
関数は第1のクラス値(他の変数と同じ)であり、関数が変数に格納され、関数のパラメータとしても、関数の戻り値としてもよいことを意味します.この特性は言語に大きな柔軟性を与えた:1つのプログラムは関数を再定義して新しい機能を追加するか、信頼できないコードを実行して安全な実行環境を作成することを避けるために関数を隠すことができ、(第16章で詳細に述べる)LuaはluaまたはC実装の関数を呼び出すことができ、Luaのすべての標準ライブラリはCで実現されている.標準ライブラリにはstringライブラリ、tableライブラリ、I/Oライブラリ、OSライブラリ、算術ライブラリ、debugライブラリがあります.
Userdata and Threads
userdataは、CデータをLua変数に格納することができ、userdataはLuaにおいて、付与値と等しい比較を除いて予め定義された動作を有しない.userdataは、アプリケーションまたはC実装ライブラリを使用して作成された新しいタイプを記述するために使用されます.たとえば、標準I/Oライブラリでファイルを記述します.以下、C APIの章で詳細に説明します.
9章で協同操作について議論するとき,スレッドを紹介する.