1

このサイトで読んだことから、以下はうまくいくはずです。親切な魂が私が間違っているところを指摘できますか?

読みやすくするために、コードにさらに説明と印刷の戻り値を埋め込みました

local m = {
 {opt = "Solar Panels", cmd = "solarPanel"}
     -- There are many more options here.
}  

function doTheMenu()
 print("Welcome to Spyder's Factory")
 print("")
 print("What would you like to make?")
 local n = 1
 local l = #m - 1
 while true do             --This while loop may or may not be relevant to the question, it's the menu
 term.clear()              --this is ComputerCraft lua, the term function is defined
 term.setCursorPos(1,2)    --elsewhere in an API
  for i, j in pairs(m) do
   if i == n then
    if i < 10 then print(i, "  ["..j.opt.."]") else  print(i, " ["..j.opt.."]") end
     fsel = j.cmd          --set fsel to the function name I require in case of a break
     tsel = j.opt          --Ditto, tsel, human-friendly name
   else
    if i < 10 then print(i, "   "..j.opt) else  print(i, "  "..j.opt) end
   end
  end
  local a, b = os.pullEvent("key") 
  if b == 200 and n > 1 then n = n - 1 end
  if b == 208 and n <= l then n = n + 1 end 
  if b == 28 then break end
 end
 write("\nSure, how many "..tsel.."? ")
 qty = tonumber(read())
 req[fsel] = req[fsel] + qty
 str = fsel.."("..qty..")"
 print("Loading function '"..fsel.."("..qty..")'") --Returns "Loading function 'solarPanel(1)'"
 func = loadstring(str)
 print(func)      --Returns "function: 2cdfc5a7"
 print("Loading function")
 func()  --The error line, Returns "string:1: attempt to call nil"
 --tellUserWhatNeed()
 --makeItHappen()
end

doTheMenu()

問題は、コードがエラーで実行に失敗することです:

string:1 attempt to call nil
4

2 に答える 2

0

これは、最終的に機能するソリューションでした:

local f = loadstring(str)
if f then
 setfenv(f, getfenv())
 f()
end

これにより、上記の行が置き換えられます。

print("Loading function '"..fsel.."("..qty..")'") 
func = loadstring(str)
print(func)    
print("Loading function")
func() 

関数をロードするための基本的なエラー処理を追加するだけでなく、

于 2012-10-16T23:21:29.167 に答える
0

また、term変数とは、それがすべてのコードでtermある場合、定義されておらず、ですnull

それは言った:どちらか_G[fsel]ですnilまたfselはありnilますか?

fsel に保存された名前で _G に宣言された関数がありますか?

問題の行の前に ei を呼び出して、print (_G[fsel])何が得られるかを確認します。

于 2012-10-16T11:30:11.210 に答える