首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ColdFusion 11中的自动类型转换

ColdFusion 11中的自动类型转换
EN

Stack Overflow用户
提问于 2014-12-12 16:19:02
回答 3查看 897关注 0票数 5

我正在将一个应用程序从ColdFusion 9迁移到ColdFusion 11。

在现有代码中,有一个变量分配给false

代码语言:javascript
运行
复制
<cfset VARIABLES.roleTypeId = false >

然后,再往下看,一个函数期望这个变量是数字的:

代码语言:javascript
运行
复制
<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行(以及其他任何行)组成:

代码语言:javascript
运行
复制
<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中执行它时,它返回以下错误消息:

如果将组件名称指定为此参数的类型,则可能找不到组件的定义文件或无法访问.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-12 16:38:11

我相信你必须修正密码。没有任何设置(据我所知)可以改变CF处理布尔类型的方式。您应该能够将上面的分配从"false“更改为0,您的函数代码就可以工作了。然而,我怀疑在其他地方,您可能会有类似<cfif variables.roletypeID IS "False">的东西,然后它就会被破坏,因为它实际上是在寻找一个字符串--这也很有效(ha)。CF将无数的值处理为布尔值(0或0、true、false、yes和no)是它的起源。有时很方便,但肯定会导致这样的事情。

同时,我不知道这种行为的改变是一个新的错误,还是一个旧的错误的修复。在我看来,把“假”当作论点,让它读成数字似乎不一致,所以新的方法对我来说似乎是正确的。然而,许多语言将0或不是0视为true和false的默认值。

编辑:

根据Adam下面的评论,我的代码示例中有人会说:

代码语言:javascript
运行
复制
<cfif somevar IS "false">

即使...would确实是数字的,也是有效的。他的例子(有用)是:

代码语言:javascript
运行
复制
#0 is "False"#

...will输出“是”-因此CF正在将字符串"false“重定向到引擎盖下的零,以便进行比较。这使我的例子不正确。

我的答案仍然是正确的,我相信。他遇到的问题是,传递给他的函数的参数--类型为"boolean“的参数--正在抛出一个错误,因为该函数需要一个数值。但是Adam的观点和例子让我认为这种行为可能是一个bug --因为CF在检查类型之前似乎没有转换成一个数字(根据Joe,它在CF 9中做了一些事情)。

票数 7
EN

Stack Overflow用户

发布于 2014-12-12 17:28:43

NumberFormat是你的救世主,在本·纳德尔的一篇文章中,我要归功于这句话

代码语言:javascript
运行
复制
<cfset VARIABLES.roleTypeId = false>
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 0 -->
<cfset VARIABLES.roleTypeId = true>
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 1 -->

因此,您应该能够在调用函数之前将其转换为预期的数字类型,或者只需执行以下操作

代码语言:javascript
运行
复制
<cfargument name="roleTypeId" default="#NumberFormat(VARIABLES.roleTypeId)#" type="numeric">
票数 3
EN

Stack Overflow用户

发布于 2014-12-12 21:18:55

我在ColdFusion 11:"将布尔值传递给数字arg时,键入强制失败“中将此作为一个bug提出。

我建议您通过将类型检查从参数中删除来解决这一问题。这可能是影响最小的解决办法。

这也是一种罕见的情况,我会在代码中添加注释,解释为什么要取消类型检查。

向乔、马克和邓肯道歉,因为他们坚决地反驳了他们的发现。不过,我不同意他们的答案是最好的方法;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27447751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档