0

文字列、数値、bool、および nil データは、簡単に扱えるように見えることに気付きました。しかし、関数やテーブルなどに関しては、実際のオブジェクトではなく参照を取得します。

この現象に名前はありますか?これら 2 セットの型の処理方法の違いを説明する用語はありますか?

a = "hi"    
b = 1
c = true
d = nil
e = {"joe", "mike"}
f = function () end
g = coroutine.create(function () print("hi") end)

print(a) --> hi
print(b) --> 1
print(c) --> true
print(d) --> nil
print(e) --> table: 0x103350
print(f) --> function: 0x1035a0
print(g) --> thread: 0x103d30
4

5 に答える 5

3

ここに表示されているのは、オブジェクトの文字列表現を返すコンパイラによる試みです。単純なオブジェクトタイプの場合、__ tostring実装はすでに提供されていますが、他のより複雑なタイプの場合、文字列表現を返す直感的な方法はありません。

役立つかもしれない詳細については、Lua:カスタムuserdataにtostringメソッドを与えるを参照してください!

于 2013-02-12T11:48:17.713 に答える
1

Lua では、数値は値であり、それ以外はすべて参照によってのみアクセスできます。しかし、印刷時の異なる動作は、関数を実際に印刷する方法がないという理由だけです (そして、テーブルには印刷のデフォルトの動作がある可能性がありますが、そうではありません。おそらく、循環参照が許可されているためです)。

于 2013-02-12T11:50:17.103 に答える
1

.Net (Microsoft Visual Basic、Visual C++、および C#) では、それらを値型および参照型として記述します。参照型は参照によって値を参照し、値型は実際の値を保持します。

lua はより単純なインタープリター型言語であるはずであり、最終的にはそれほど重要ではないことを考えると、lua はあまり考えていないと思います。使用できない型に対して操作を使用しようとするとエラーが発生します)。

いずれにせよ、私の経験上、ほとんどのプログラマーはそれらを「値型」と「参照型」として理解しているので、この 2 つの用語を使い続けるのが最善だと思います。

于 2013-02-25T20:29:13.373 に答える
0

あなたが見ているのは、print関数の動作です。それらを使用することで引数になりtostringます。print次のように使用して実装できますio.write(少し簡略化されています):

function print(...)
    local args = {n = select('#',...), ...}
    for i=1,args.n do
        io.write(tostring(args[i]), '\t')
    end
    io.write('\n')
end

への呼び出しに注意してくださいtostring。デフォルトでは、数値、ブール値、および文字列の表現を返します。他のタイプを文字列に変換する適切なデフォルトの方法はないため、タイプとオブジェクトへの役に立たない内部ポインターのみを表示します (インスタンスを区別できるようにするため)。ここでソースを表示できます。

于 2013-02-12T19:55:53.707 に答える
0

驚くかもしれませんが、Lua には値と参照の区別がありません。:-)ここここ
を 読んでください。

于 2013-02-12T20:52:45.843 に答える