2017-04-13 9 views
0

私はSublimeとCoronaを使ってLuaプログラムを作成しようとしています。 Webページを取得し、パターンを使用してページから特定のテキストを抽出し、抽出したテキストを表に保存したいと考えています。私はコロナが提供するnetwork.requestメソッドを使用しています変数はnetwork.request -Luaのevent.responseを保存しません

問題:抽出したテキストが、作成したグローバル変数に保存されていません。私がそれを参照しようとするか、関数の外側でそれを印刷しようとすると、それはnilを返します。これがなぜ起こっているのか?

私はevent.response出力のスクリーンショットを添付しました。これは私がここに私のLuaのテーブルに

Event.response Output

を保存する欲しいものであることは私のコードです:

local restaurants = {} 
yelpString = "" 

--this method tells the program what to do once the website is retrieved 
local function networkListener(event) 

    if (event.isError) then 
     print("Network error: ", event.response) 
    else 
     yelpString = event.response 

     --loops through the website to find the pattern that extracts 
     restaurant names and prints it out 
     for i in string.gmatch(yelpString, "<span >(.-)<") do 
      table.insert(restaurants, i) 
      print(i) 
     end 
    end 
end 

-- retrieves the website 
network.request("https://www.yelp.com/search? 
cflt=restaurants&find_loc=Cleveland%2C+OH%2C+US", "GET", networkListener) 
+0

networkListenerが呼び出されていることを確認しましたか?それらのテキストを関数の外でどのように印刷するかを示してください...あなたは何を参照しようとしていますか?レストラン、またはそのフィールドの1つ?レストランはグローバルbtwではありません... – Piglet

答えて

0

これはスコープの問題のように聞こえます。あなたが与えた出力から、networkListenerが呼び出されており、そのテキストをrestaurantsテーブルに追加しているようです。さらに、restaurantsをテーブルとして定義するので、テーブルを参照するときはそれをnilではなくテーブルにする必要があります。したがって、控除では、範囲外のどこかからrestaurantsテーブルにアクセスしようとしていることが問題です。

restaurantsをファイルの最上位レベル(つまり、関数またはブロック内にない)として「ローカル」として宣言すると、ファイル全体からアクセスできるようになりますが、ファイルの外部にはアクセスできなくなります。ファイル。したがって、あなたのコードのtable.insert(restaurants, i)は動作しますが、ファイルの外側からrestaurantsを参照しようとすると、nilとなります。私はこれがあなたが走っている問題の原因だと推測しています。

スコープの詳細については、Programming in Luaをご覧ください。この本はLua 5.0用ですが、ローカル変数のスコープ規則はLuaの後のバージョンでは変更されていません(この記事の執筆時点では最新はLua 5.3です)。

関連する問題