関数を作成するための構文は何ですか?しかし、その実装をコードのさらに下に追加しますか?
だから大まかにこのように:
- 関数を定義する
doX
- 電話
doX
(コードのさらに下) doX
実装(つまり、ファイルの下部にあるすべての関数)
関数を作成するための構文は何ですか?しかし、その実装をコードのさらに下に追加しますか?
だから大まかにこのように:
doX
doX
(コードのさらに下)doX
実装(つまり、ファイルの下部にあるすべての関数)参照する変数があれば十分です。local funcName
1つの注意点がありますが、目的には十分です。これは機能します:
local funcName
function callIt()
print(funcName())
end
function defineIt()
funcName = function() return "My Function" end
end
defineIt()
callIt()
defineIt
( )と呼ぶ前に()を定義している限りcallIt
、期待どおりに機能するはずです。ただし、このようなことはできません(これは警告です):
local funcName
print(funcName())
funcName = function() return "My Function" end
エラーが発生します:attempt to call local 'funcName' (a nil value)
。
ああ...それで、実際に関数を定義する前にfuncNameを呼び出す方法は本当にありませんか?つまり、funcName自体を最初に呼び出す前にdefineItが呼び出されていることを確認する必要がありますか?
この点を明確にしたかったのですが、コメントよりも答えの方がいいと思いました。
LuaはCやC++よりもはるかに単純な言語です。いくつかの単純な基盤の上に構築されており、一部を飲み込みやすくするための構文糖衣が含まれています。
Luaには「関数定義」のようなものはありません。関数はファーストクラスのオブジェクトです。数値28または文字列リテラルが値であるのと同じように、これらはLuaの値"foo"
です。「関数定義」は、単に値(つまり関数)を変数に設定するだけです。変数には、関数値を含むあらゆる種類の値を含めることができます。
すべての「関数呼び出し」は、変数から値を取得してそれを呼び出そうとすることです。その値が関数の場合、関数は指定されたパラメーターで呼び出されます。その値が関数(またはメタメソッドを持つテーブル/ユーザーデータ__call
)でない場合は、実行時エラーが発生します。
変数にまだ設定されていない関数を呼び出すことは、これを行うことができる以上にできません。
local number = nil
local addition = number + 5
number = 20
addition
そしてそれに25を持っていることを期待してください。それは起こりません。したがって、同じ理由で、これを行うことはできません。
local func = nil
func(50)
func = function() ... end
Paulが指摘したように、定義した別の関数内から関数を呼び出すことができます。ただし、その変数に含める必要のあるものを入力するまで、それを呼び出す関数を実行することはできません。
他の人が書いているように、呼び出し前に割り当てられていない関数を実行時に呼び出すことはできません。あなたはそれを理解する必要があります:
function myFunc() print('Something') end
これは単なるシンタックスシュガーです:
myFunc = function() print('Something') end
さて、この種のコードはあなたが望むようには機能しないことは理にかなっています:
print(greeter(io.read())) -- attempt to call global 'greeter' (a nil value)
function greeter(name) return 'Hello '..name end
greeter
変数を使用する場合、その値はnil
次の行でのみ設定されるため、その値はです。
ただし、「メイン」プログラムを上部に、関数を下部に配置する場合は、これを実現する簡単な方法があります。「メイン」関数を作成し、それを下部の最後のものとして呼び出します。関数が呼び出されるまでに、すべての関数は対応するグローバル変数に設定されます。
-- start of program, your main code at the top of source code
function main()
local name = readName()
local message = greeter(name)
print(message)
end
-- define the functions below main, but main is not called yet,
-- so there will be no errors
function readName() io.write('Your name? '); return io.read() end
function greeter(name) return 'Hello, ' .. name end
-- call main here, all the functions have been assigned,
-- so this will run without any problems
main()