在ColdFusion中,你可以用一行代码实现什么功能?

9
有没有一种单行代码的方式来编写这个逻辑,使其更加简洁优雅?
<cfif ThumbnailWidth EQ 0>
   <cfset Width = 75>
<cfelse>
   <cfset Width = ThumbnailWidth>
</cfif>

8
你手头的东西有什么问题吗?单行并不等同于优雅。 - anon
这取决于你是否认为简洁等同于优雅。意见不一。 - Joel Mueller
@anon,显然你还没有发现许多语言支持的三元运算符。 - The Muffin Man
6个回答

33

Coldfusion 9:


(Coldfusion 9:)
<!--- Syntax: ((condition) ? trueStatement : falseStatement) --->
<cfset width = ((ThumbnailWidth EQ 0) ? 75 : ThumbnailWidth) />

ColdFusion 8及以下版本:

<!--- Syntax: IIf(condition, trueStatement, falseStatement) --->
<cfset width = IIf((ThumbnailWidth EQ 0), 75, ThumbnailWidth) />

有人会说出于性能考虑,应该避免使用IIf()。在这种简单的情况下,我确信您不会发现任何区别。Ben Nadel的博客讨论了IIF()的性能,以及CF 9中的新三元运算符


有没有使用CF9的人知道我是否可以在CF9版本中使用“==”而不是“EQ”?我猜最好还是使用EQ,因为它向后兼容,但在这种情况下并不重要。 - Dan Sorensen
1
在实际应用中,为了代码的可维护性,我会将硬编码的75替换为一个可以在配置文件中设置的变量。 - Dan Sorensen
是的,您可以使用“==”,但一些带有“>”或“<”的运算符应仅在CFScript中使用。 - Henry

6
我认为您的原文已经足够优雅,它讲述了故事且易于阅读。但这显然是个人偏好。幸运的是,在CFML中有至少九种方法可以完成任何事情。
您可以将其放在一行上(CFML没有行尾要求):
<cfif ThumbnailWidth EQ 0><cfset Width = 75><cfelse><cfset Width = ThumbnailWidth></cfif>

你还可以使用IIF()函数 - 它能够解决问题:

<cfset Width = IIf(ThumbnailWidth EQ 0, 75, ThumbnailWidth)>

这个结构有点奇怪,我认为更清晰的方式是使用“?”和“:”。IIF()的优势在于它也可以内联使用(毕竟它是一个函数)。例如:

<img src="#ImageName#" width="#IIf(ThumbnailWidth EQ 0, 75, ThumbnailWidth)#">

这种形式经常用于在注入动态代码的同时保持HTML布局更加整洁。

1
我相信IIf()需要使用DE() - Tomalak
@Tomalak:我认为在这种情况下不需要,因为我们传递的是整数而不是字符串。(来源:http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_c-d_37.html) - Dan Sorensen
1
"DE()是“延迟评估”的意思,这可能是使用IIF()最令人困惑的部分。默认情况下,IIF()的每个子句都会被评估(就像在Evaluate()函数中一样)。如果这不是您想要的,请使用DE(),但在这种情况下,这些都是简单表达式,所以并不重要。使用它不会有坏处,但也不是必需的。" - Jim Davis

2

像Neil说的那样,目前的状态是可以的。如果你真的想要一行代码,你可以使用三元运算符将其转换为cfscript

<cfscript>width = (ThumbnailWidth == 0) ? 75 : ThumbnailWidth;</cfscript>

我还没有测试过这段代码,但是它应该可以工作。

2
如果你在寻找简洁的代码,那么你可以比其他示例更进一步,利用CF对非零值的评估作为true
<!--- CF 9 example --->
<cfset width = ThumbnailWidth ? ThumbnailWidth : 75> 

<!--- CF 8 and below --->
<cfset width = iif(ThumbnailWidth, ThumbnailWidth, 0)>

自然地,您会牺牲一些清晰度,但这是为了更紧凑的代码而做出的权衡。

1

我个人更喜欢这样的东西:

<cfscript>
  Width = ThumbnailWidth;
  if(NOT Val(Width)) // if the Width is zero, reset it to the default width.
    Width = 75;
</cfscript>

0
假设您通过表单提交(无论是使用GET还是POST方法)将ThumbnailWidth变量传递,如果使用LUCEE 5或更高版本,代码可能如下所示:
//POST
width = form.ThumbnailWidth ?: 0;
//GET
width = url.ThumbnailWidth ?: 0;

默认值为0,而表单和URL范围包含客户端请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接