2009-12-16 28 views
7

Có cách viết logic này trong một dòng mã đơn giản, thanh lịch không?Bạn có thể làm gì trong ColdFusion trong một dòng?

<cfif ThumbnailWidth EQ 0> 
    <cfset Width = 75> 
<cfelse> 
    <cfset Width = ThumbnailWidth> 
</cfif> 
+8

Có gì sai với những gì bạn có? Single line! = Thanh lịch. –

+0

Điều đó phụ thuộc vào việc bạn có nghĩ ngắn gọn == thanh lịch hay không. Ý kiến ​​khác nhau. –

+0

@anon, dường như bạn chưa phát hiện ra toán tử bậc ba mà nhiều ngôn ngữ hỗ trợ. –

Trả lời

26

Coldfusion 9:

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

Coldfusion 8 và dưới đây:

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

Một số sẽ nói rằng IIf() là để thể tránh được vì lý do hiệu suất. Trong trường hợp đơn giản này, tôi chắc chắn bạn sẽ không tìm thấy sự khác biệt. Blog của Ben Nadel có more discussion on IIF() performancethe new ternary operator in CF 9.

+0

ColdFusion 9 & Railo 3.1 – Sergii

+0

Có ai có CF9 biết tôi có thể sử dụng == thay vì EQ trong phiên bản CF9 không? Tôi đoán nó vẫn là thực hành tốt nhất của CF để sử dụng EQ vì nó tương thích ngược, nhưng không quan trọng trong trường hợp này. –

+1

Trong thực tế thực tế, để bảo trì mã, tôi sẽ thay thế mã hóa cứng 75 bằng một biến có thể được đặt trong tệp cấu hình. –

2

Như Neil đã nói, không sao đâu. Nếu bạn thực sự muốn có một dòng duy nhất bạn có thể làm cho nó một cfscript với một nhà điều hành ternary, như:

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

đã không được kiểm tra mã này, nhưng nó phải làm việc.

+2

Điều này sẽ không hoạt động bên dưới ColdFusion 9. – Jayson

+0

Điểm tốt, không chắc tại sao tôi không đề cập đến điều đó. Cảm ơn! – Pablo

6

Tôi tìm thấy bản gốc đủ thanh lịch - kể câu chuyện, dễ đọc. Nhưng đó chắc chắn là một sở thích cá nhân. May mắn là luôn có ít nhất chín cách để làm bất cứ điều gì trong CFML.

Bạn có thể đặt rằng trên cùng một dòng (CFML không có end-of-line yêu cầu):

<cfif ThumbnailWidth EQ 0><cfset Width = 75><cfelse><cfset Width = ThumbnailWidth></cfif> 

Bạn cũng có thể sử dụng IIF() Function - nó sẽ làm các trick:

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

Cấu trúc này là một chút kỳ cục '- rõ ràng hơn tôi nghĩ. Sức mạnh của IIF() là nó cũng có thể được sử dụng nội tuyến (nó là một hàm sau khi tất cả). Ví dụ:

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

Biểu mẫu cuối cùng này thường được sử dụng để duy trì bố cục HTML sạch trong khi tiêm mã động.

+1

Tôi tin rằng 'IIf()' yêu cầu sử dụng 'DE()'. – Tomalak

+0

@Tomalak: Tôi không nghĩ rằng nó được yêu cầu trong trường hợp này kể từ khi chúng tôi đang đi qua số nguyên chứ không phải là dây. (nguồn: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_c-d_37.html) –

+1

Chính xác - DE() là "Đánh giá Trễ" - và đó có lẽ là phần khó hiểu nhất sử dụng IIF(). Theo mặc định, mỗi mệnh đề của IIF() được đánh giá (như trong hàm Đánh giá()). Nếu đó không phải là những gì bạn muốn bạn phải sử dụng DE() - nhưng trong trường hợp này đây là những biểu thức đơn giản để nó không quan trọng. Nó sẽ không làm tổn thương để sử dụng nó - nhưng nó không cần thiết. –

1

Cá nhân tôi thích một cái gì đó hơn dọc theo dòng này:

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

Nếu bạn đang tìm kiếm mã ngắn gọn, sau đó bạn có thể mang nó một bước xa hơn so với các ví dụ khác, lợi dụng đánh giá phi CF của -zero giá trị như true:

<!--- CF 9 example ---> 
<cfset width = ThumbnailWidth ? ThumbnailWidth : 75> 

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

Đương nhiên, bạn sẽ hy sinh một chút rõ ràng, nhưng đó là sự đánh đổi cho mã nhỏ gọn hơn.

Các vấn đề liên quan