2013-10-05 41 views
5

作爲一個初學者我有一種簡單的問題,在Lua表功能甚至被稱爲:爲什麼如果它不選擇

a = function() 
    print("hello") 
end 

b = {125, 116, a()} 

    print(b[1]) 

應該只打印125,而且打印hello過。即使沒有選擇表格值。

回答

5

刪除括號應該得到它的工作:(live @ codepad.org):

a = function() 
    print("hello") 
end 

--[[ Previous code: 
    'a()' will execute the function 'a' and will evaluate to its return value 
    b = {125, 116, a()} 
]] 

-- a is now a reference to the function (you could execute it by using: 'b[3]()') 
b = {125, 116, a} 

print(b[1]) 

否則,你有三個值填寫表格:

  • 125,

  • 和函數的返回值呼叫'a()'。

6

書面,你已經創建了分配給a不帶參數並沒有返回功能;它有打印「你好」的副作用。

然後,您創建存儲在b表中有三個表達式:b[1]b[2]是數字,b[3]是調用存儲在a的功能,這將是由通常的規則通過浸軋調整到一個值的結果根據nil的要求。所以b將是一個只包含兩個條目的表格,兩個數字。但是,在創建b的值時調用了a(),該值打印出「hello」。

最後,您可以撥打print(b[1])打印預期號碼。

這完全解釋了您看到的輸出。由於這可能不是您期望看到的輸出,因此您可以通過多種方式解決此問題。

例如,聲明a返回「hello」而不是調用print。

a = function() return "hello" end 

然後調用它,而構建存儲在b將不再打印表,b將獲得第三個元素,字符串「hello」。

或者,您可以通過忽略導致其被調用的圓括號來存儲寫入b的函數。

b = {125, 116, a} 

此外,b保持一個表,該表是三個元素的序列。在這種情況下,b[3]是打印「hello」的功能。

您選擇的操作完全取決於您對b表中存儲的值的預期用途。

相關問題