2010-08-03 69 views
3

在ColdFusion的,當我打電話IsDefined("root.L1[1].L2"),我收到以下錯誤:ColdFusion的錯誤():參數必須是語法上有效的變量名

Parameter 1 of function IsDefined, which is now root.L1[1].L2, must be a syntactically valid variable name.

這是一個有效的變量名,那麼是什麼原因?

這裏是我的簡單測試代碼:

<cfscript> 
    root = StructNew(); 
    root.L1 = ArrayNew(1); 
    root.L1[1] = StructNew(); 
    root.L1[1].L2 = "foo"; 

    WriteOutput("root.L1[1].L2 is: #root.L1[1].L2#<br/>"); //no exception 

    if(IsDefined("root.L1[1].L2")) //exception! 
    WriteOutput("It is defined!"); 
    else 
    WriteOutput("It is not defined!"); 
</cfscript> 
+1

自從我做完CF以來已經有一段時間了,但對我而言,這看起來不像「變量名」。它看起來像一個變量名(root)加上一個屬性訪問,一個索引器查找,然後是另一個屬性訪問。換句話說,它不是一個簡單的變量名稱,它實際上至少會在封面上創建三個方法調用。 – 2010-08-03 21:20:51

回答

12

嘗試

StructKeyExists(root.L1[1],"L2") 

代替isDefined()

我依稀記得有複雜的變量是問題與isdefined(),但我不記得這個版本。

+0

但如果我不確定那個root.L1是否有任何元素呢?有沒有其他的選擇?即使'b'沒有'c'元素,我也可以檢查'IsDefined(「a.b.c.d」)',但是如果結構中有一個數組,我想這不起作用。 – Jenni 2010-08-04 14:14:39

+0

然後,您可能需要使用AND語句堆疊您的支票。在執行上面的最後一個structKeyExists之前檢查數組的長度[使用類似arrayLen(root.L1)GT 0]的東西。 – 2010-08-04 17:50:15

+0

首先,抱歉有多少編輯,我不習慣不能按下輸入。無論如何,這就是我想要做的:''我找不到位置2的元素。那麼,爲什麼它不發回錯誤呢?然後我嘗試了'',並且說'你試圖將類型爲coldfusion.runtime.ExceptionInformation的標量變量解引用爲具有成員'的結構。 WTFCF? – 2012-10-04 12:56:50

0

正如在後續提到的評論,你應該堆棧邏輯檢查一拉:

if(arrayLen(root.L1) gte 1 AND structKeyExists(root.L1.[1],'L2')){ } 

解析器將跳過第二個邏輯論證,如果第一個失敗了,所以你不會得到一個錯誤第二次如果第一次通過。

相關問題