Lua-<2>-タイプと値

3986 ワード

  • 注:lua 5.0以上のバージョンはtableを除く.getnメソッドは、
  • の代わりに#tableNameを使用できます.
  • 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 not initialized) 
    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を使用して他の値を使用するように使用することができます.一般的に同じ変数が異なるタイプの値を表すと混乱するので、使わないほうがいいですが、特にnilなどの便利さをもたらすことができます.
  • Nil Luaの特殊なタイプで、彼は1つの値しかありません:nil、1つのグローバル変数が割り当てられていない前のデフォルト値はnilです;グローバル変数にnilを割り当てると、この変数
  • を削除できます.
  • Booleansの2つの値falseとtrue.ただし、Luaのすべての値が条件として使用できることに注意してください.制御構造の条件ではfalseとnilが偽である以外は真である.だからLuaは0も空串も本当だと思っています.
  • 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 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 --

    [[...]]も使用できます.文字列を表します.この形式の文字列は、複数の行を含んでもよいし、ネストしてもよいし、エスケープシーケンスを説明しないし、最初の文字が改行であれば自動的に無視される.この形式の文字列は、コードを含むのに便利です.
    実行すると、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およびThreads userdataは、Lua変数にCデータを格納することができ、userdataは、Luaにおいて、付与値および等しい比較を除いて予め定義された動作を有しない.userdataは、アプリケーションまたはC実装ライブラリを使用して作成された新しいタイプを記述するために使用されます.たとえば、標準I/Oライブラリでファイルを記述します.Luaの式には、数値定数、文字列定数、変数、一元演算子、二元演算子、関数呼び出しが含まれます.非伝統的な関数定義とテーブル構造も可能です.