2

別のプログラム内にロードされたプログラムの変数変更をキャプチャするために何を使用できるかについて、どこを見ればよいかわかりません。

これが私のコードです。

function launch()
    shell.run("clear")
    print("Preparing for first time run.")
    sleep(1)
    print("")
    local program = netTest()
    local file = loadstring(program)
    file()
    sleep(3)
    shell.run("clear")
end

function netTest()
  local output = http.get("http://pastebin.com/raw.php?i=hzZv3YH2")
  if output then
        local contents = output.readAll()
        output.close()
        return contents
  else
        print("Empty response")
        return false
  end
end

local program = netTest()
local file = loadstring(program)

launch()

呼び出しているコードは次のとおりです。

function ping()
fails = 0
pingResult = 0
print("Testing Internet Connection.")
print("")
oldx, oldy = term.getCursorPos()
print("Connection Test 1")
http.request("http://www.google.com/")
        if os.pullEvent() == "http_success" then
                local oldx, oldy = term.getCursorPos()
                term.setCursorPos(46,oldy-1)
                io.write("Passed")
        else
                local oldx, oldy = term.getCursorPos()
                term.setCursorPos(46,oldy-1)
                io.write("Failed")
                fails = fails+1
        end
sleep(1)
print("Connection Test 2")
http.request("http://www.microsoft.com/")
        if os.pullEvent() == "http_success" then
                local oldx, oldy = term.getCursorPos()
                term.setCursorPos(46,oldy-1)
                io.write("Passed")
        else
                local oldx, oldy = term.getCursorPos()
                term.setCursorPos(46,oldy-1)
                io.write("Failed")
                fails = fails+1
        end
sleep(1)
print("Connection Test 3")
http.request("http://www.example-failure.com/")
        if os.pullEvent() == "http_success" then
                local oldx, oldy = term.getCursorPos()
                term.setCursorPos(46,oldy-1)
                io.write("Passed")
        else
                local oldx, oldy = term.getCursorPos()
                term.setCursorPos(46,oldy-1)
                io.write("Failed")
                fails = fails+1
        end
sleep(1)
        if fails == 0 then
                print("")
                print("")
                print("Test Complete, no failures detected.")
                sleep(1.5)
        elseif fails == 1 then
                print("")
                print("")
                print("1 connection failures detected. A Website Host might be down however connectivity is still there.")
                print("")
                print("Test Complete.")
                sleep(1.5)
        elseif fails == 2 then
                print("")
                print("")
                print("2 connection failures detected. Possible limited web connectivity.")
                print("")
                print("Test Complete.")
                sleep(1.5)
        elseif fails == 3 then
                print("")
                print("")
                print("Catastrophic connection failure detected. A firewall or improper internet settings may be the problem.")
                print("")
                print("Test Complete.")
                pingResult = __pingResult + 3
                sleep(1.5)
        end
end

ping()

あなたが見ることができるようにそれがしていることは、インターネットへの接続があることを確認するためにいくつかのページにhttpリクエストをすることによって接続をテストするプログラムを外部で実行しています。(私は知っています、それは少し足りないです、しかし私はまだ学んでいます)。

基本的に、接続が3つのステージすべてで失敗を読み取ると、pingResult変数は3になります。インターネットユーティリティで呼び出された最初のプログラムから実行したいのは、その変数が何に設定されているかを記録することです。閉じたときに3に設定されている場合は、設定されている変数を記録し、簡単にするために、その変数を出力して、0または3のいずれかであることがわかるようにします。後で何かを実行しますが、要点はわかります。 。

私は他のいくつかのことを試しましたが、これをどのように行うのか理解できないようです。私はまだ新しいので、ランダムなものを試しましたが、どれもうまくいかなかったようです。または、間違っただけなので、どうしたらよいかわかりません。これを数日間試しても成功しませんでした。

4

1 に答える 1

3

まず第一に、あなたが投稿したコードのほとんどはノイズです-printステートメント、カーソル操作、ペーストビンからのLuaコードの取得(?)、文字通り何もしないコードを含む、あなたの質問とはまったく関係のないあらゆる種類のロジック。そのため、まだ返信がありません。

参照:スマートな方法で質問する方法: ボリュームは精度ではありません


あなたの投稿から無関係なものをすべて取り除くと、次のものが残ります。

-- main.lua
local file = loadfile('nettest.lua')
file()

-- nettest.lua
pingResult = 123

あなたの質問に答えるために:

ご覧のとおり、外部でプログラムを実行しています。

外部では何も実行していません。外部コードを取得しましたが、ローカルで実行されています。コードがグローバル状態に加えた変更はすべて表示されます。この場合、main.lua は にアクセスできますpingResult。たとえば、次のように記述できます。

-- main.lua
local file = loadfile('nettest.lua')
file()
print(pingResult)

もちろん、スクリプトと ping モジュールをより明確に分離したい場合は、そのコードがグローバルに書き込むのではなく、値を返すようにする必要があります。

-- main.lua
local file = loadfile('nettest.lua')
local pingResult = file()
print(pingResult)

-- nettest.lua
local pingResult
-- ... code the computes the result an stores it in pingResult ...
return pingResult
于 2013-02-08T22:55:56.897 に答える