2

あらゆる種類のループ内であらゆる種類の条件が使用された場合、私は最も奇妙なエラーを解決しようとするのに最も苦労してきました。

私が繰り返し発生するエラーは、「複雑なオブジェクトタイプを単純な値に変換できない」というものです。を含む行<cfloop condition="true">。さらに面白いのは、a<cfbreak>がループから抜け出さないことです。Eclipse内のデバッガーを使用して、このコードが実際に実行されていることを確認しました。

奇妙なことに、getが実行されることはわかっていても、コードが永久にループすることがあり<cfbreak>、最初の反復でエラーが発生することもあります。

この問題は他の2台のコンピューターでも発生することを確認しました。

常に真の条件を使用することに誰もが気が狂う前に、私は有効な条件を持っていまし<cfloop condition="not done"> た。これにより、同じエラーが発生しました。

私は他の誰かによって書かれた古いコードに取り組んでいるので、現時点では書き直しはオプションではありません。

私はColdFusion8.0.1を最新のアップデーター4にパッチして、問題が解決するかどうかを確認しましたが、解決していません。

コードは基本的に次のようになります。

<cfloop condition="true">
    <cfif condition is true>
        <cfbreak>
    </cfif>
</cfloop>

実行されるコードは次のとおりです。

<cfset done = false />
<cfloop condition="true">
    <cfscript>
        try
        {
            lineitem.quantity = quantityRemaining;

            quantityRemaining = 0;

            arrayAppend( currentTub, lineitem );

            currentCartItemCount = currentCartItemCount + lineitem.quantity;
            currentTubItemCount = currentTubItemCount + lineitem.quantity;

        }
        catch(Any e){}


        availableSpaceInCart = this.itemsPerCart - currentCartItemCount;
        availableSpaceInTub = this.itemsPerTub - currentTubItemCount;
    </cfscript>

    <cfif quantityRemaining LTE 0>
        <cfset done = true />
        <cfbreak />
    </cfif>
</cfloop>

アップデート:

さて、私たちは問題が何であるかを理解しました。このループには2つの<CFOUTPUT>タグがラップされていました。外側の<CFOUTPUT query='query_name' groupby='column_name'>タグは、QueryNew()ColdFusionが気に入らなかった何らかの理由で生成されたクエリを使用していました。そこで、その問題を解決し、奇妙な問題を解決しました。

4

4 に答える 4

2

あいまいな値を条件付きループに渡しています。

あなたが書くとき:

<cfloop condition="x">

あなたはColdFusionに言っています:'x'がtrueと評価される限りループを続けます。これは、(myvar gte 10)のようなステートメントであり、myvarが10以上の場合にtrueと評価されます。ループ内の何らかのメカニズムがmyvarをデクリメントすると、最終的に、ループを通過するとループが停止します。 myvarは10以上になりません(10を下回りました)。

それでは、あなたの状態を見てみましょう:

<cfloop condition="true">

CFはそれを次のように考えていますか?

<cfif 'true'>

または

<cfif TRUE>

1つは間違いなく間違っており、ColdFusionステートメントに書き込むとエラーがスローされます。「文字列」をブール値のTRUEまたはFALSE評価に評価できないことに気付くでしょう。文字列値の解析により、ColdFusionが実際のブール値のTRUEまたはFALSE値と混同されることはほぼ間違いありません。オブジェクト関連のエラーを引き起こしているのは、おそらくこの「true」からTRUEへの字句変換です。あなたが望むものは、おそらく次のとおりです。

doneの値は開始時にFALSEに設定されているため、論理NOTと組み合わせると、trueと評価されます。

次に、後でステートメントを下に移動します。

   <cfif quantityRemaining LTE 0>
        <cfset done = true />
   </cfif>

<cfbreak>強制的にループから抜け出すステートメントは必要ありません。条件付きでループしている場合、その変数の評価はループの反復に影響します(読み取り:ループを停止します)。

さらに、状態を次のように変更することもできます。

<cfloop condition="quantity LTE 0">

そして、done変数はまったく必要ありません。

于 2011-10-12T20:10:05.163 に答える
1

quantityRemainingコードから、の値が0以下に達した場合にループから抜け出したいようです。したがって、「true」を使用するのではなく、それをcfloopの条件として使用してみませんか。次に、cfbreakブロックを削除できます。これは、基本的にcfloop条件が実行していることだからです。

<cfset quantityRemaining = 5>
<cfloop condition="quantityRemaining GT 0">
    <!--- your code here --->
    <cfoutput>#quantityRemaining#<br></cfoutput>

    <!--- don't forget to change the value, otherwise you'll loop forever --->
    <cfset quantityRemaining = quantityRemaining - 1>
</cfloop>
于 2011-10-12T21:00:23.687 に答える
1

「複雑なオブジェクトタイプは単純な値に変換できません。 」というエラーは、まさにそれを意味します。

複雑なオブジェクト(オブジェクト、配列、構造体、クエリなど)は、単純な値(文字列、数値、日付、ブール値など)に変換できません。これは、グローバルに定義された方法がないためです。

投稿したコードに基づいて、これらの変数の少なくとも1つは単純な値を保持していません。

  • currentCartItemCount
  • currentTubItemCount
  • lineitem.quantity
  • this.itemsPerCart
  • this.itemsPerTub
  • 残りの量

どれを見つけるには、これをループの前に置きます。

<cfdump var=#isSimpleValue(currentCartItemCount)# />
<cfdump var=#isSimpleValue(currentTubItemCount)# />
<cfdump var=#isSimpleValue(lineitem.quantity)# />
<cfdump var=#isSimpleValue(this.itemsPerCart)# />
<cfdump var=#isSimpleValue(this.itemsPerTub)# />
<cfdump var=#isSimpleValue(quantityRemaining)# />
<cfabort/>

出力false(またはno)がある場合は、isSimpleValue関数のラップを解除して何が含まれているかを調べ、コードを逆方向にトレースして理由を調べます。

true(または)を6回取得した場合は、yes別のことが起こっているため、おそらくより多くのコードを共有する必要があります。

于 2011-10-12T23:08:00.240 に答える
0
<cfloop condition="true">

と同じです

<cfloop condition=true>

と同じ<cfif 'true'>ように<cfif true>

基本的に設定しているのは、条件が常に真であるため、無限ループです。コードがこれから抜け出さない場合は、深刻な問題が発生します。

おそらくやりたいことは次のとおりです<cfbreak>。ループからを削除します。

<cfloop condition="quantityRemaining GT 0">
于 2011-10-13T12:49:43.940 に答える