だから、私は関数から変数を取得しようとしています。次のステートメントを含む Garry's Mod スクリプトがあります。
http.Fetch("http://google.fr", function(body)
return body
end)
私の質問は、これから私のボディ変数を取得する方法ですか? 「グローバル」キーワード (PHP など) や Lua の参照などはないと思います。ありがとう!
だから、私は関数から変数を取得しようとしています。次のステートメントを含む Garry's Mod スクリプトがあります。
http.Fetch("http://google.fr", function(body)
return body
end)
私の質問は、これから私のボディ変数を取得する方法ですか? 「グローバル」キーワード (PHP など) や Lua の参照などはないと思います。ありがとう!
これを処理する最も簡単な方法は、使用しているインターフェイスに結果を物理的にロードする関数を作成するbody
か、Fetch 呼び出し内にコードを追加して自分でロードすることです。このようなもの:
-- just an example of some function that knew how to load a body result
-- in your context
function setBody(body)
someapi.Display(body)
end
http.Fetch('http://someurl.com',
function(body)
-- you have access to outer functions from this scope. if you have
-- some function or method for loading the response, invoke it here
setBody(body)
-- or just someapi.Display(body)
end
)
あなたはより機能的なデザインの考え方をしているように見え、イベント駆動型のデザインを混ぜているので、混乱していると思います。イベント ドリブン設計では、基本的に params を使用して関数を呼び出し、呼び出した関数が完了したら最終的に実行するコードを含む関数コールバックを与えます。
また、 Lua には一種のグローバル キーワードがあります。グローバル テーブルがあります_G
。を設定することもできますが_G.body = body
、私はそれを避け、呼び出されたときにロードする方法を知っているコールバック関数を渡します。
関数から単純に値を返すことができない場合は、upvalueを使用して更新できます。これは、関数の実行後に使用可能になります。
local bodycopy
http.Fetch("http://google.fr", function(body)
bodycopy = body
end)
-- assuming http.Fetch block here until the content of the URL is retrieved...
print(bodycopy)
「グローバル」キーワード (PHP など) や Lua の参照などはないと思います。
サブ関数として定義された変数にアクセスできるクロージャがあります。local
例えば:
function makeCounter()
local i = 0
local function counterfunc()
i = i + 1
return i
end
return coutnerfunc
end
local counter1 = makeCounter()
print(counter1()) -- 1
print(counter1()) -- 2
print(counter1()) -- 3
local counter2 = makeCounter()
print(counter2()) -- 1
print(counter2()) -- 2
print(counter1()) -- 4
これは、コールバック関数で使用するオブジェクトを格納できることを意味します。
function ENT:GetPage()
-- The implicitly-defined self variable...
http.Fetch("www.example.com", function(body)
-- ...is still available here.
self.results = body
end)
end
http.Fetch
は非同期関数であることに注意してください。後でページが実際にフェッチされたときにコールバックを呼び出します。これはうまくいきません:
function ENT:GetPage()
local results
http.Fetch("www.example.com", function(body)
results = body
end)
return results -- The closure hasn't been called yet, so this is still nil.
end