7

それはなぜです ?

<cfif "yes" eq "true">

Yes equals true.

<cfelse>

Yes does not equal true.

</cfif>

ページが出力されます。「はいは真です。」

4

6 に答える 6

13

Chris と Keshav の答えは正しいです。ColdFusion は値を変換します。ColdFusion のデータ変換に関する公式ドキュメントは次のとおりです。

タイプ間の変換

Value     As Boolean     As number     As date-time     As string

"Yes"     True           1             Error            "Yes"

"No"      False          0             Error            "No"

True      True           1             Error            "Yes"

False     False          0             Error            "No"
于 2013-03-19T10:47:40.313 に答える
10

ColdFusionには動的変数タイプがあり、実行時にいくつかの奇妙な変換を行います。文字列は、キャストせずにブール値、日付、および数値として使用できます。これには、長所と短所の両方があります。

単純な文字列比較を行う必要がある場合は、組み込みのcompare()関数を使用できます。

Ben Nadelが、文字列比較オプションの概要をここに示します-http ://www.bennadel.com/blog/236-ColdFusion-String-Comparison-Compare-vs-Equals-vs-CompareTo-.htm

于 2013-03-19T08:55:25.197 に答える
3

真/偽の比較には十分注意する必要があります。単純なものにする必要がありますが、コードの記述方法によっては、TRUE/FALSEの評価が異なる場合があります。ほとんどすべての定義により、FALSEは常にビット単位の0(およびCFではNo)になります。また、TRUEはビット単位の1になりますが、Yesおよび0以外の数値にもなります。したがって、42はまだTRUEです。そして、-1はまだTRUEです(MSAccessのYes/ Noデータ型に特に感謝します:-p)。

FALSEは常に0(またはNOまたはFALSE)であるため、通常は、TRUEをチェックするよりもNOTFALSEまたはNEQ0をチェックする方が適切です。しかし、それでも、あなたはまだ気をつけています。何をTRUEと見なすかを決定し、その完全な評価を行います。ColdFusionは、TRUE変数とFALSE変数を異なる方法でキャストする場合があります。次のコードの結果を見てください。

(querySimスクリプトを提供してくれたBertDawsonとJamieJacksonに感謝します。)

<!--- set up the fake query: --->
<cfscript>
/**
 * Accepts a specifically formatted chunk of text, and returns it as a query object.
 * v2 rewrite by Jamie Jackson
 * 
 * @param queryData      Specifically format chunk of text to convert to a query. (Required)
 * @return Returns a query object. 
 * @author Bert Dawson (bert@redbanner.com) 
 * @version 2, December 18, 2007 
 */
function querySim(queryData) {
    var fieldsDelimiter="|";
    var colnamesDelimiter=",";
    var listOfColumns="";
    var tmpQuery="";
    var numLines="";
    var cellValue="";
    var cellValues="";
    var colName="";
    var lineDelimiter=chr(10) & chr(13);
    var lineNum=0;
    var colPosition=0;

    // the first line is the column list, eg "column1,column2,column3"
    listOfColumns = Trim(ListGetAt(queryData, 1, lineDelimiter));

    // create a temporary Query
    tmpQuery = QueryNew(listOfColumns);

    // the number of lines in the queryData
    numLines = ListLen(queryData, lineDelimiter);

    // loop though the queryData starting at the second line
    for(lineNum=2;  lineNum LTE numLines;  lineNum = lineNum + 1) {
        cellValues = ListGetAt(queryData, lineNum, lineDelimiter);

        if (ListLen(cellValues, fieldsDelimiter) IS ListLen(listOfColumns,",")) {
            QueryAddRow(tmpQuery);
            for (colPosition=1; colPosition LTE ListLen(listOfColumns); colPosition = colPosition + 1){
                cellValue = Trim(ListGetAt(cellValues, colPosition, fieldsDelimiter));
                colName   = Trim(ListGetAt(listOfColumns,colPosition));
                QuerySetCell(tmpQuery, colName, cellValue);
            }
        } 
    }
    return( tmpQuery );
}
</cfscript>

<!--- populate the fake query --->    
<cfscript>
fakeQuery = querySim('
testID , isThisTruthy
1 | TRUE
2 | FALSE
3 | YES
4 | NO
5 | 1
6 | 0
7 | -1
8 | 42
');
</cfscript>
<!--- End of the fake query setup --->

<!--- Dump the fakeQuery so we can see what we've got. --->
<cfdump var="#fakeQuery#" label="fakeQueryInfo" />

<!--- 
    Not really necessary since the query is created above. Just included for 
    clarity, as everything above this line can really be ignored if connecting 
    to a real query. 
--->
<cfquery name="truthyCheck" dbtype="query">
    SELECT testID, isThisTruthy
    FROM fakeQuery
</cfquery>

<!--- Begin the truthy statements. --->
<br/><br/>
<strong>cfif isThisTruthy >></strong> 
<!--- 
    This one has an implicit evaluation of TRUE or FALSE that seems to be based on a
    broader (and more accurate) definition of what should be TRUE or FALSE. However,
    it's much less clear in what you're trying to do. 
--->
<br/>
<cfoutput query="truthyCheck">
    #testID#: #isThisTruthy# | <cfif isThisTruthy>True<cfelseif NOT isThisTruthy>False<cfelse>NULL</cfif> <br/>
</cfoutput>
<br/><br/>

<!--- 
    The rest of these appear to actually evaluate down to a bit (using the standard
    1,0,YES,NO,TRUE,FALSE definitions) and then they do an integer comparison. This 
    may not be completely what you're looking for.
--->
<strong>cfif isThisTruthy IS TRUE >></strong>
<br/>
<cfoutput query="truthyCheck">
    #testID#: #isThisTruthy# | <cfif isThisTruthy IS TRUE>True<cfelseif isThisTruthy IS NOT TRUE>False<cfelse>NULL</cfif> 
    <!--- 1 IS 1 IS TRUE, but -1 IS 1 IS FALSE. --->
    <br/>
</cfoutput>
<br/><br/>
<strong>cfif isThisTruthy EQ 1 >></strong>
<br/>
<cfoutput query="truthyCheck">
    #testID#: #isThisTruthy# | <cfif isThisTruthy EQ 1>True<cfelseif isThisTruthy NEQ 1>False<cfelse>NULL</cfif> 
    <!--- 1 EQ 1 IS TRUE, but -1 EQ 1 IS FALSE. --->
    <br/>
</cfoutput>
<br/><br/>
<strong>cfif isThisTruthy NEQ 0 >></strong>
<br/>
<cfoutput query="truthyCheck">
    #testID#: #isThisTruthy# | <cfif isThisTruthy NEQ 0>True<cfelseif isThisTruthy EQ 0>False<cfelse>NULL</cfif> 
    <!--- 1 NEQ 0 and -1 NEQ 0 both evaluate to the same. --->
    <br/>
</cfoutput>
<br/><br/>
<strong>cfif isThisTruthy NEQ FALSE >></strong>
<br/>
<cfoutput query="truthyCheck">
    #testID#: #isThisTruthy# | <cfif isThisTruthy NEQ FALSE>True<cfelseif isThisTruthy EQ FALSE>False<cfelse>NULL</cfif> 
    <!--- 1 NEQ 0 and -1 NEQ 0 both evaluate to the same. --->
    <br/>
</cfoutput>

あなたが得るでしょう:

cfif isThisTruthy >>
1:TRUE | 真
2:偽| 誤り
3:はい| 真
4:いいえ| 誤り
5:1 | True
6:0 | 誤り
7:-1 | 真<---技術的に正しい
8:42| 正しい<---技術的に正しい

cfif isThisTruthy IS TRUE >>
1:TRUE | 真
2:偽| 誤り
3:はい| 真
4:いいえ| 誤り
5:1 | True
6:0 | 誤り
7:-1 | 誤り <---技術的に正しくない8:42
| False <---技術的に正しくない

cfif isThisTruthy EQ 1 >>
1:TRUE | 真
2:偽| 誤り
3:はい| 真
4:いいえ| 誤り
5:1 | True
6:0 | 誤り
7:-1 | 誤り<---技術的に正しくない8:42
| False <---技術的に正しくない

cfif isThisTruthy NEQ 0 >>
1:TRUE | 真
2:偽| 誤り
3:はい| 真
4:いいえ| 誤り
5:1 | True
6:0 | 誤り
7:-1 | 真<---技術的に正しい
8:42| 正しい<---技術的に正しい

cfif isThisTruthy NEQ FALSE >>
1:TRUE | 真
2:偽| 誤り
3:はい| 真
4:いいえ| 誤り
5:1 | True
6:0 | 誤り
7:-1 | 真<---技術的に正しい
8:42| 正しい<---技術的に正しい

于 2013-03-19T16:48:05.827 に答える
2

ColdFusion では、"yes" と "true" を式として使用すると、どちらも数値 1 に変換されます。

于 2013-03-19T08:19:43.997 に答える
0

coldfusion では、"yes" と "true" は bit(1) として解釈され、"no" と "false" は bit(0) として解釈されるため、"yes" と "true" は等しくなります。同じように

<cfif 1 eq "true">

Yes equals true.

</cfif>
于 2013-03-19T13:10:31.793 に答える