Luis's answerを試してみてください言語に初心者よりterserはを望ん可能性がある場合、権利です。私はそれをちょっと詳しく説明しようと思います。
あなたの質問は、TI計算機の特定のモデルに埋め込まれたLuaのコンテキストにあります。したがって、スタンドアロンのLuaとは異なる詳細がありますが、ほとんどの場合、それらの詳細は、あなたの環境で利用できるライブラリと関数に関係します。 Luaの組み込みバージョンがその作者によって配布されたスタンドアロンのLuaと大きく異なることは珍しいことです(ただしLuaはオープンソースなので可能です)。 (Lua Binariesは多くのプラットフォーム用のバイナリのリポジトリです。Lua for Windowsは、Windows用電池、付属の完全なディストリビューションです。)
あなたのサンプルコードでは、交絡要因、それは電卓が提供するクラスのシステムとのインターフェースに必要な詳細を持っていますフレームワーク。その詳細は、ほとんどあなたのequation
オブジェクトとequation:init()
関数が呼び出されている間に接続が存在しないと表示されます。それを接着できる技術があるので、それはちょうど気晴らしです。
あなたが知っているあなたの質問は、可変長関数(可変数の引数を持つ関数)が宣言され、Luaでどのように実装されているかを混乱させます。 Luisの答えに対するあなたのコメントから、あなたはLuaのプログラミング(PiL)のオンライン版を読んでいます。あなたはsection 5.2を引用しました。 PiLは言語のバックグラウンドの良いソースです。残念なことに、可変的な機能は、流行してきた機能の1つです。ライン上の本の版はLuaバージョン5.0では正しいですが、TIの電卓はおそらくLua 5.1.4を実行しています。
ルア5では、変数の関数は、残りの引数を表すシンボル...
で終わるパラメータリストで宣言されています。 Lua 5.0では、arg
という名前の "マジック"ローカル変数が呼び出され、...
に一致する引数を含むテーブルが含まれていました。これは、すべてのバリデーショナル関数が呼び出されたときにテーブルを作成することを必要としました。これは不要なオーバーヘッドとガベージコレクタへの負担の原因です。したがって、Lua 5.1では、実装が変更されました。...
は、呼び出された関数で一致する引数のエイリアスとして直接使用できますが、実際にテーブルは作成されません。代わりに、引数の数が必要な場合はselect("#",...)
と書き、n番目の引数の値が望ましい場合はselect(n,...)
と書きます。
例の混乱要因がクラスシステムに戻ってきます。関数equation:init(...)
を宣言したいとします。この宣言はコロン構文を使用するため、equation.init(self,...)
と書くことと同等です。したがって、最終的にクラスフレームワークの__call
メタメソッドを使用して呼び出されると、実際の最初の引数はself
となり、0以上の実際の引数は...
と一致します。
以下アムルさんのコメントで述べたように、表現select(n,...)
が実際にself.answers
を構築するため、この場合に特に有用であるが、また、self.pipe
の初期設定で可能なバグにつながる上のn番目の引数から、すべての値を返します。ここで
は、あなたがequation:init()
のあなたの定義で達成しようとしているものの私の改訂近似であるが、私は手元にTI電卓の一つを持っていないと、これはテストされていないことに注意してください:
function equation:init(...)
self.equation = select(1, ...)
self.pipe = { (select(1,...)) }
self.selected = 1
self.answers = { select(2,...) }
end
上記の改訂版では、最初の引数である1つの要素と、残りのすべての引数を含むテーブルを作成する{select(2,...)}
を含むテーブルを作成するために{(select(1,...))}
と書いています。このようにしてテーブルに挿入できる値の数には限界がありますが、その制限は関数の戻り値の数や関数に渡すことができるパラメータの数に関係しているため、 ...
への参照を超えました。これは一般的ではない可能性があり、{ unpack(t) }
をとすると、t
の配列部分がすべてコピーされないことに注意してください。
関数の書き方がやや効率的ではない方法は、渡された引数の上にループを書くことです。これは元の答えのバージョンです。それは次のようになります:
'call'メタメソッドが' equation'に定義されているコードを追加してください。このコードはそれがなければ本当に意味をなさない。 – Mankarse