創建函數的語法是什麼,但是在代碼中再添加它的實現?Lua:如何在定義之前調用函數?
所以大致是這樣的:
- 定義功能
doX
- 呼叫
doX
(代碼進一步下跌)(在文件的底部,即所有功能關閉) doX
FPGA實現
創建函數的語法是什麼,但是在代碼中再添加它的實現?Lua:如何在定義之前調用函數?
所以大致是這樣的:
doX
doX
(代碼進一步下跌)(在文件的底部,即所有功能關閉)doX
FPGA實現oh...so there's really no way to call funcName prior to having actually defined the function then? i.e. you still need to make sure defineIt is called before your first call to funcName itself?
我想澄清這一點,我覺得答案會比評論更好。
Lua是一種比C或C++更簡單的語言。它建立在一些簡單的基礎上,用一些語法糖來使它的一部分更易於吞嚥。
在Lua中沒有這樣的「函數定義」。函數是一流的對象。它們的值是,值爲,與數字28或字符串文字"foo"
是值一樣。 「函數定義」只是將一個值(即函數)設置爲一個變量。變量可以包含任何類型的值,包括函數值。
所有的「函數調用」是從一個變量中取值並試圖調用它。如果該值是一個函數,那麼該函數將被調用給定的參數。如果該值不是函數(或者具有__call
metamethod的表格/用戶數據),則會出現運行時錯誤。
你可以沒有更多的調用並沒有在一個變量尚未設置比你能做到這一點的函數:
local number = nil
local addition = number + 5
number = 20
,並期望addition
擁有它25。這不會發生。因而,出於同樣的原因,你不能做到這一點:
local func = nil
func(50)
func = function() ... end
正如保羅指出,你可以從你定義另一個函數中調用的函數。但是你不能執行這個函數調用它,直到你用它需要包含的變量填充變量。
您只需要有一個變量來引用。 local funcName
就足以滿足您的需求了。這將工作:
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)
。
您不需要將函數定義包裝在'defineIt'中。它只會用'funcName = function()...'作爲單獨的一行來工作。畢竟這是'本地函數funcName()'做的。 –
哦......所以真的沒有辦法在實際定義函數之前調用funcName呢?即在你第一次調用funcName之前,你仍然需要確保defineIt被調用? – Greg
@Greg:是的。如果你真的想在「定義」它之前調用它,你可以使用'local funcName = function()end',但它不會做任何有用的事情(它也不會拋出運行時錯誤)。然後,您可以將其設置爲對您有用的工作。 –
正如其他人撰寫的那樣,您不能在運行時調用未在調用之前分配的函數。你必須明白:
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()
你*不能*調用函數的定義之前,但也許保羅的回答滿足您的需求。 – lhf
[Lua函數範圍問題]的可能重複(http://stackoverflow.com/questions/6394721/lua-function-range-problem) – finnw