2014-12-12 29 views
5

Tôi di chuyển một ứng dụng từ ColdFusion 9 đến ColdFusion 11.Loại Chuyển đổi tự động trong ColdFusion 11

Trong mã hiện có một bài tập của một biến để false:

<cfset VARIABLES.roleTypeId = false > 

Và sau đó, xa hơn xuống, một hàm cho rằng biến này là số:

<cffunction name="rolesForStudy" > 
    <cfargument name="id" hint="Study Id"> 
    <cfargument name="roleTypeId" default="#VARIABLES.roleTypeId#" type="numeric"/> 
</cffunction> 

Tôi thừa hưởng mã và không thể bảo vệ quyết định của lập trình viên ban đầu theo cách này - nhưng, trong ngắn hạn, nó làm việc trong Coldfusion 9, và nó không hoạt động trong Coldfusion 11 (trả về lỗi kiểu dữ liệu). Tôi cho rằng ColdFusion 9 đã tự động chuyển đổi false thành 0.

Câu hỏi của tôi: Có cài đặt cấu hình nào mà tôi có thể thay đổi trong Coldfusion 11 để làm cho nó thực hiện chuyển đổi như ColdFusion 9 không? Hoặc tôi sẽ phải sửa mã này, cùng với rất nhiều ví dụ tương tự khác trong toàn bộ ứng dụng? Tôi hoặc quản trị viên Coldfusion của tôi cũng không thể tìm thấy bất kỳ thông tin nào về điều này trong giao diện Quản trị viên ColdFusion, tài liệu ColdFusion hoặc trực tuyến.

Sửa trong những đáp ứng cho Adam Cameron trong ý kiến ​​

tôi đã tạo ra một tập tin đó bao gồm 10 dòng sau (và không có gì khác):

<cfset VARIABLES.roleTypeId = false > 
<cfoutput> 
<p>#rolesForStudy(1, VARIABLES.roleTypeId)#</p> 
</cfoutput> 

<cffunction name="rolesForStudy" > 
    <cfargument name="id" hint="Study Id"> 
    <cfargument name="roleTypeId" default="#VARIABLES.roleTypeId#" type="numeric"/> 
    <cfreturn "It worked" > 
</cffunction> 

Khi tôi thực hiện nó trong ColdFusion 9 , nó hiển thị các từ "Nó hoạt động".

khi tôi thực hiện nó trong ColdFusion 11, nó sẽ trả về thông báo lỗi sau:
Nếu tên thành phần được quy định như một loại lập luận này, có thể là hoặc là một tập tin định nghĩa cho thành phần không thể tìm thấy hoặc không thể truy cập được.

+1

Bất kể vấn đề của bạn là gì, nó không phải là một vấn đề giả mạo với số (nó sẽ chuyển thành 0 tốt). Hành vi này đã không thay đổi trong ColdFusion 11. Bạn có thể cung cấp một trường hợp repro thích hợp thể hiện những gì bạn đang nhìn thấy? Cũng cung cấp lỗi chính xác (sao chép và dán từ màn hình). Cũng có thể trả tiền để đọc điều này: http://blog.adamcameron.me/2013/09/short-self-contained-correct-compilable.html –

+0

Holy f *** (chỉ cần chạy mã cập nhật của bạn ở đây. Tôi nhận được như vậy Hãy nhìn vào nó) –

Trả lời

7

Tôi tin rằng bạn sẽ phải sửa mã. Không có cài đặt nào (mà tôi biết ở bất kỳ mức nào) thay đổi cách CF xử lý các kiểu boolean. Bạn sẽ có thể thay đổi việc gán ở trên từ "false" thành 0 và mã chức năng của bạn sẽ hoạt động. Tuy nhiên tôi nghi ngờ ở nơi khác bạn có thể có một cái gì đó như <cfif variables.roletypeID IS "False"> mà sau đó sẽ bị hỏng vì nó là trong sự thật tìm kiếm một chuỗi - trong đó cũng hoạt động (ha). CF xử lý vô số các giá trị như boolean (0 hoặc không 0, đúng, sai, có và không) là một di sản của nguồn gốc của nó. Đó là thuận tiện vào những thời điểm nhưng chắc chắn dẫn đến những thứ như thế này.

Trong khi đó, tôi tự hỏi liệu thay đổi hành vi này có phải là lỗi mới hay sửa lỗi cũ. Theo quan điểm của tôi, hãy chuyển "false" làm đối số và đọc nó như là số có vẻ không phù hợp để cách mới có vẻ phù hợp với tôi. Tuy nhiên, nhiều ngôn ngữ xử lý 0 hoặc không 0 làm giá trị mặc định cho đúng và sai.

EDIT:

Theo ý kiến ​​của Adam dưới đây, ví dụ của tôi mã mà ai đó sẽ nói:

<cfif somevar IS "false"> 

... sẽ làm việc ngay cả khi someVar là thực sự số.Ví dụ của anh ấy (hữu ích) là:

#0 is "False"# 

... sẽ xuất ra "có" - vì vậy CF đang tính lại chuỗi "sai" thành số không dưới mui xe để so sánh. Điều đó làm cho ví dụ của tôi không chính xác.

Câu trả lời của tôi vẫn đúng, tôi tin tưởng. Vấn đề anh ta gặp phải là đối số được truyền cho hàm của anh ta - là kiểu "boolean" đang ném một lỗi vì hàm này mong đợi một giá trị số. Nhưng điểm và ví dụ của Adam khiến tôi nghĩ rằng hành vi này có thể là lỗi - vì nó xuất hiện CF không được đúc thành một số trước khi kiểm tra loại (cái gì đó đã làm trong CF 9 theo Joe).

+0

Cảm ơn. Tôi muốn xem liệu có bất kỳ câu trả lời nào khác không trước khi tôi đánh dấu bất kỳ câu trả lời nào là chính xác - nhưng tôi đã upvoted câu trả lời của bạn. Câu trả lời của bạn phù hợp với những gì tôi đã giả định, nhưng tôi hy vọng một người nào đó quen thuộc hơn với ColdFusion hơn là tôi sẽ có một giải pháp cho phép tôi tránh được rất nhiều việc tái cấu trúc mã. –

+0

Vâng ... có thể có một số anh chàng Java bóng bẩy ở đây biết một số tài sản mơ hồ :) –

+3

Đôi khi bạn chỉ cần gank de-jankify mã cũ. –

3

NumberFormat là vị cứu tinh của bạn, tín dụng sẽ truy cập this comment trên một trong các bài viết của Ben Nadel.

<cfset VARIABLES.roleTypeId = false> 
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 0 --> 
<cfset VARIABLES.roleTypeId = true> 
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 1 --> 

Vì vậy, bạn sẽ có thể hoặc chuyển đổi nó sang dạng số dự kiến ​​trước khi gọi hàm, hoặc chỉ làm

<cfargument name="roleTypeId" default="#NumberFormat(VARIABLES.roleTypeId)#" type="numeric"> 
+0

Tìm tốt, tôi thấy nó thực sự đáng ngạc nhiên rằng 'NumberFormat' không hoạt động, nhưng' Val() 'không (trong ACF9, nó có trong Railo). Tuy nhiên, tôi hy vọng OP chỉ sửa chữa mã. Tôi đã chỉ thấy rằng 'Int()' hoạt động như là tốt mặc dù. Tuy nhiên, tôi hy vọng OP chỉ sửa chữa mã cũ. –

+0

Bạn không cần phải bỏ nó. Xem bình luận của tôi về câu hỏi và câu trả lời của Mark. –

+0

@cfqueryparam - Ý bạn là gì ['val()'] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-6e64.html) không hoạt động? Không có ký tự số ở đầu "false" (hoặc "true" cho vấn đề đó), vì vậy nó sẽ trả về số không (0). Nó có làm gì đó khác trong Railo không? – Leigh

1

Tôi đã huy động này như là một lỗi trong ColdFusion 11: "Type coercion failure when passing boolean to a numeric arg ".

Tôi khuyên bạn nên giải quyết vấn đề này bằng cách chọn loại kiểm tra đối số. Đây có lẽ là sửa chữa có tác động thấp nhất.

Đây cũng là trường hợp hiếm hoi mà tôi thêm nhận xét vào mã, giải thích lý do tại sao bạn đã thực hiện việc kiểm tra loại.

Xin lỗi Joe, Mark & Duncan để mâu thuẫn với những gì họ đang tìm kiếm. Điều đó nói rằng, tôi không đồng ý rằng câu trả lời của họ là cách tiếp cận tốt nhất ở đây ;-)

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