2013-10-17 34 views
0

我試圖學習Lasso 9中的捕獲,但我很努力地想辦法在array->forEach捕獲中訪問#1局部變量。也許我的做法是錯誤的。是否有對我需要使用的父捕獲的引用?以下是工作代碼:如何訪問條件內部數組中的#1 - > forEach

define paramstovars() => { 

    local(p = web_request->params) 

    #p->foreach => { 
     local(i = #1) 
     if(#i->type == 'pair') => { 
      var(#i->first->asstring = #i->second->asstring) 
     } 
    } 

} 

以下是我試圖讓工作不依賴於冗餘局部變量的定義代碼:

define paramstovars() => { 

    local(p = web_request->params) 

    #p->foreach => { 
     if(#1->type == 'pair') => { 
      var(#1->first->asstring = #1->second->asstring) 
     } 
    } 

} 

在第二個例子中,我收到一個錯誤位置超出範圍:1最大值爲0(錯誤代碼-1)在調用var()的行上。

拋開這種自定義方法的明顯的安全性問題,在嵌套條件內使#1可用的最有效方法是什麼?

感謝您的時間和協助。

回答

1

#1在每個捕獲中被替換 - 所以是的,你需要把它分配給另一個本地以便在更深的捕獲中使用它。如果您需要與當地的合作再次嘗試使用查詢表達式來代替:

with i in web_request->params do { 
    if(#i->type == 'pair') => { 
     var(#i->first->asstring = #i->second->asstring) 
    } 
} 

而且,我不建議設置變量以這種方式 - 它擁有一種安全隱患。將參數存儲在單個變量中然後從中設置特定的變量會更好。有一組標籤在這裏做類似的事情:getparam/postparam

0

我的經驗是#1在第一次被調用時被消耗掉。至少我從來沒有能夠在同一次捕獲中兩次打電話。

如果我不止一次需要這個值,我將它作爲本地優先。就像你在你的例子中做的那樣。

+0

忘記所有我以前寫的!看到我的下一個回答 – jolle

0

稍後進行一些實驗。

與我所寫的內容相反,您可以多次調用#1,但是您嘗試的內容是您在捕獲(有條件)內部捕獲的內容。 第二次捕獲將有它自己的輸入參數。

這裏的工作,測試的例子,做你想做的事:

local(
    myarray = array(1, 2 = 'two', 3 = 'four', 4), 
    mypairs = map 
) 

#myarray -> foreach => { 
    if(#1-> isa(::pair)) => { 
     #mypairs -> insert(#1 -> first -> asstring = #1 -> second -> asstring) 
    }(#1) 
} 
#my pairs 

其結果將是圖(2 =二,3 =爲四個)

訣竅是的發送foreach參數條件捕獲:`{一些代碼}(#1)

現在,所有的工作。我建議你看看卡爾頓最新添加到tagswap。當你正試圖做這將解決同一個問題的方式不是創造一堆動態VAR的更好:

www.lassosoft.com/tagswap/detail/web_request_params

+0

臭蟲,柯擊敗了我 – jolle