[解決済み] 関数の引数のデフォルト値を定義する
質問
Luaのwikiで、見つからない引数のデフォルト値を定義する方法を見つけました。
function myfunction(a,b,c)
b = b or 7
c = c or 5
print (a,b,c)
end
これしかないのでしょうか?PHPのスタイルである
myfunction (a,b=7,c=5)
は機能しないようです。Luaの方法がうまくいかないわけではなく、この方法しかないのかと思っています。
どのように解決するのですか?
PHPやPythonのように名前付き引数やデフォルト値が欲しい場合は、テーブルコンストラクタで関数を呼び出すことができます。
myfunction{a,b=3,c=2}
(これはLuaの多くの場所で見られるもので、例えば LuaSocketのプロトコルモジュールの高度な形式である のコンストラクタなどです。 IUPLua .)
この関数自体は、次のようなシグネチャを持つことができます。
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
-- function continues down here...
end
パラメータの表から足りない値は
__index
テーブルから取得されます (
メタテーブルのドキュメント
).
もちろん、テーブル・コンストラクタや関数を使用すれば、より高度なパラメータ・スタイルを作成することができます。例えば はここで は、パラメータ名とデフォルト値を定義したテーブルから、名前付きまたは位置指定の引数テーブルを取る関数と、通常の引数リストを取る関数を構築する関数です。
言語レベルではない機能として、このような呼び出しは新しい動作やセマンティクスを提供するために変更することができる。
- 変数が複数の名前を受け入れるようにすることができます。
- 位置変数とキーワード変数を混在させることができる - そして両方を定義すると、どちらかが優先される(またはエラーが発生する)。
- キーワードのみの位置なし変数も、名前なしの位置なし変数と同様に作ることができます。
- かなり冗長なテーブルの構築は、文字列をパースすることによって行うことができる
- 引数リストは、関数が1テーブル以外の何かで呼び出された場合、そのまま使用することができます。
引数トランスレータを書くのに便利な関数をいくつか紹介します。
unpack
(に移動する)。
table.unpack
に移動)。
setfenv
(5.2で非推奨となり、新しい
_ENV
構造で非推奨)、そして
select
(これは与えられた引数リストから一つの値を返すか、あるいは、リストの長さを
'#'
).
関連
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] Bash関数にパラメータを渡す
-
[解決済み] "パラメータ "と "引数 "の比較【重複
-
[解決済み] JavaScriptの関数への引数の数
-
[解決済み] オプションの引数を持つPython関数を作成するにはどうしたらいいですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み】R関数でオプション引数を指定する "正しい "方法
-
[解決済み] T-SQL - デフォルトのパラメータを持つ関数
-
[解決済み] swiftで関数から複数の値を返す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MIPSの関数(プロシージャ)について
-
[解決済み] Linuxにおけるoutb()関数呼び出しとは?
-
[解決済み] MATLABを使用して、ステップ入力または単位ランプに対する閉ループシステムの応答をプロットしてください。
-
[解決済み] "パラメータ "と "引数 "の比較【重複
-
[解決済み】関数はパラメータとして渡すことができますか?
-
[解決済み】Luaの.と:の違いについて
-
[解決済み] swiftで関数から複数の値を返す
-
[解決済み] どのように私はSwiftで完了ハンドラを持つ関数を作成することができましたか?
-
[解決済み] Clojureで関数の引数にデフォルト値を作成する方法
-
[解決済み] 再帰的関数の仕組みを理解する