2014-12-12 3 views
5

Я проникаю приложение от ColdFusion 9 до 11. ColdFusionАвтоматическое преобразование типа в ColdFusion 11

В существующем коде есть присвоение переменной false:

<cfset VARIABLES.roleTypeId = false > 

А потом, дальше вниз, функции, ожидающей эта переменная будет числовым:

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

Я унаследовал код, и я не могу защитить решение оригинального программатора установить это так, но, короче говоря, он работал в ColdFusion 9, и он не работает в ColdFusion 11 (возвращая ошибку типа данных). Я предполагаю, что ColdFusion 9 автоматически преобразовывал false в 0.

Мой вопрос: Есть ли параметр конфигурации, который я могу изменить в ColdFusion 11, чтобы сделать это преобразование, например ColdFusion 9? Или мне придется исправить этот код, а также, вероятно, множество других подобных примеров во всем приложении? Ни я, ни наш администратор ColdFusion не смогли найти какую-либо информацию об этом в интерфейсе администратора ColdFusion, документации ColdFusion или в Интернете.

Редактировать в ответ на Адама Камерона в комментариях

Я создал файл, который состоит из следующих 10 строк (и ничего больше):

<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> 

Когда я исполню ее в ColdFusion 9 , он отображает слова «Это сработало».

, когда я исполню ее в ColdFusion 11, он возвращает следующее сообщение об ошибке:
Если имя компонента задается как тип этого аргумента, то возможно, что либо файл определения для компонента не может быть найден или недоступен.

+1

Независимо от вашей проблемы, это не проблема приведения фальшивого числа в числовое значение (оно будет отлично отбрасываться до 0). Это поведение не изменилось в ColdFusion 11. Можете ли вы предоставить правильный пример воспроизведения, который демонстрирует то, что вы видите? Также укажите точную ошибку (скопируйте и вставьте с экрана). Также можете заплатить, чтобы прочитать следующее: http://blog.adamcameron.me/2013/09/short-self-contained-correct-compilable.html –

+0

Holy f *** (просто запустил ваш обновленный код здесь. Я получаю то же самое WTF ?! Заглядывая в него) –

ответ

7

Я считаю, что вам придется исправить код. Нет настроек (которые я знаю, во всяком случае), которые изменяют способ CF обрабатывает логические типы. Вы должны иметь возможность изменить присвоение выше от «false» до 0, и ваш код функции будет работать. Однако я подозреваю, что в другом месте у вас может быть что-то вроде <cfif variables.roletypeID IS "False">, которое затем будет сломано, так как на самом деле ищет строку - также работы (га). Работа CF с множеством значений как булевых (0, а не 0, истина, ложь, да и нет) является наследием ее происхождения. Это удобно порой, но определенно приводит к таким вещам.

Между тем, я задаюсь вопросом, является ли это изменение поведения новой ошибкой или исправлением старой ошибки. По-моему, передача «false» в качестве аргумента и чтение его как числового кажется непоследовательным, поэтому способ сделать это кажется мне правильным. Однако многие языки используют 0 или не 0 как значения по умолчанию для true и false.

EDIT:

Согласно комментариям Адама ниже, мой пример кода, где кто-то сказал бы:

<cfif somevar IS "false"> 

... будет работать, даже если somevar действительно числовыми.Его пример (полезно) является то, что:

#0 is "False"# 

... Выход «да» - так CF является переделывая строку «ложь» в ноль под капотом для сравнения. Это делает мой пример неправильным.

Мой ответ по-прежнему верен, я верю. Проблема, с которой он сталкивается, заключается в том, что аргумент передается его функции - наличие типа «boolean» вызывает ошибку, потому что функция ожидает числовое значение. Но точка Адама и пример заставляют меня думать, что, возможно, это поведение является ошибкой - так как кажется, что CF не отбрасывает число до того, как проверит тип (что-то это сделал в CF 9 в соответствии с Джо).

+0

Спасибо. Я хочу посмотреть, появятся ли какие-либо другие ответы, прежде чем я помечаю их как правильные, но я уже подтвердил ваш ответ. Ваш ответ соответствует тому, что я предполагал, но я надеялся, что кто-то более знаком с ColdFusion, чем у меня будет решение, которое позволит мне избежать много рефакторинга кода. –

+0

Yep ... может быть какой-то пятно Java-парня здесь, который знает какое-то непонятное свойство :) –

+3

Когда-нибудь вам просто нужно де-янкизировать старый код. –

3

NumberFormat - ваш спаситель, кредит будет на this comment в одной из статей Бен Наделя.

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

Таким образом, вы должны быть в состоянии либо преобразовать его в ожидаемом числового типа перед вызовом функции или просто делать

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

Хорошая находка, мне было очень удивительно, что 'NumberFormat' действительно работает, но' Val() 'не делает (в ACF9, он работает в Railo). Тем не менее, я надеюсь, что OP просто исправляет код. Я просто нашел, что 'Int()' работает, как хорошо. Тем не менее, я надеюсь, что OP только исправляет старый код. –

+0

Вам не нужно бросать его. См. Мой комментарий по вопросу и ответ Марка. –

+0

@cfqueryparam - Что значит ['val()'] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-6e64.html) не работает? Нет числовых символов в начале «false» (или «true»), поэтому он должен возвращать ноль (0). Делает ли это что-то по-другому в Railo? – Leigh

1

Я поднял это как ошибка в ColdFusion 11: "Type coercion failure when passing boolean to a numeric arg ».

Я рекомендую вам обойти это, взяв тип, чтобы проверить аргумент. Это, вероятно, самое малое решение.

Это также редкий случай, когда я бы добавил комментарий к коду, объяснив , почему вы выбрали тип проверки.

Извинения перед Джо, Марк & Дункан за решительное противоречие с тем, что они находили. Тем не менее, я не согласен с тем, что их ответы являются наилучшим подходом здесь ;-)

Смежные вопросы