Luaタイプと値

9676 ワード

Luaは動的タイプ言語であり、変数はタイプ定義しない.Luaには8つの基本タイプがあります.
nil、boolean、 numberstring、userdata、functionthreadtable

関数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 not initialized)
a = 10
print(type(a)) --> number
a = "a string!!"
print(type(a)) --> string
a = print
a(type(a)) --> function

Nil


Luaの特殊なタイプで、彼は1つの値しかありません:nil;グローバル変数が割り当てられていない前のデフォルト値はnilです.グローバル変数負nilに変数を削除します.

Booleans


2つの値falseとtrueを取ります.ただし、Luaのすべての値が条件として使用できることに注意してください.制御構造の条件ではfalseとnilが偽である以外は真である.だからLuaは0も空串も本当だと思っています.

Numbers


実数を表し、Luaには整数はありません.CPU演算浮動小数点数が整数より遅いという誤った見方が一般的である.実際にはそうではありません.整数の代わりに実数を使うと誤差はありません(数値が1000000000000を超えない限り).Luaのnumbersは誤差を心配することなく任意の長い整数を処理することができる.Luaをコンパイルするときにnumbersの代わりに長整数型または単精度浮動小数点型を使用することもできます.一部のプラットフォームハードウェアで浮動小数点数がサポートされていない場合、この特性は非常に役に立ちます.

Strings


文字のシーケンスを指します.luaは8ビットバイトなので、文字列は埋め込まれた0を含む任意の数値文字を包むことができます.これは、任意のバイナリデータを文字列に格納できることを意味します.Luaの文字列は変更できません.新しい変数を作成して、次のように文字列を保存できます.
a = "one string"
b=string.gsub(a,"one","another") --changestringparts 
print(a) --> one string
print(b) --> another string

stringは他のオブジェクトと同様に、Luaは自動的にメモリの割り当てと解放を行います.Luaは長い文字列を効率的に処理でき,1 MのstringはLuaでよく見られる.文字列は、一重引用符または二重引用符で表すことができます.
a = "a line"
b = 'another line'

スタイルを統一するには、2つの引用符がネストされていない限り、1つを使用することが望ましい.文字列に引用符が含まれている場合は、エスケープ記号を使用して表すこともできます.Luaのエスケープシーケンスは次のとおりです.
\a bell
\b back space       -- 
\f form feed        --  

newline -- \r carriage return -- \t horizontal tab -- \v vertical tab \\ backslash -- "\" \" double quote -- \' single quote -- \[ left square bracket -- \] right square bracket -- 

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

文字列では、アルファベットをddd(dddは3桁の10進数)で表すこともできます.「alo 123」「と'97 lo1004923」は同じです.[...]]を使用して文字列を表すこともできます.この形式の文字列は、複数の行を含んでもよいし、ネストしてもよいし、エスケープシーケンスを説明しないし、最初の文字が改行であれば自動的に無視される.この形式の文字列は、コードを含むのに便利です.
page = [[ <HTML> <HEAD> <TITLE>An HTML Page</TITLE> </HEAD> <BODY> Lua [[a text between 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 convert it to a number if n == nil then
   error(line .. " is not a valid number")
else
print(n*2)
end

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

Functions


関数は第1のクラス値(他の変数と同じ)であり、関数が変数に格納され、関数のパラメータとしても、関数の戻り値としてもよいことを意味します.この特性は言語に大きな柔軟性を与えた:1つのプログラムは関数を再定義して新しい機能を追加することができて、あるいは信頼できないコードを実行して安全な運行環境を作成することを避けるために関数を隠すことができて、またこの特性はLuaがオブジェクト向けを実現する中で重要な役割を果たしてLuaはluaあるいはCが実現した関数を呼び出すことができて、Luaのすべての標準ライブラリはCで実現したのです.標準ライブラリにはstringライブラリ、tableライブラリ、I/Oライブラリ、OSライブラリ、算術ライブラリ、debugライブラリがあります.

Userdata and Threads


userdataは、CデータをLua変数に格納することができ、userdataはLuaにおいて、付与値と等しい比較を除いて予め定義された動作を有しない.userdataは、アプリケーションまたはC実装ライブラリを使用して作成された新しいタイプを記述するために使用されます.たとえば、標準I/Oライブラリでファイルを記述します.