【问题标题】:cffunction: second argument based on first argumentcffunction:基于第一个参数的第二个参数
【发布时间】:2018-03-22 22:47:26
【问题描述】:

我有以下代码,它首先创建一个对象,然后调用一个名为 init 的函数。

<cfset SESSION.objWatchlist = createObject("component", "path") />
<cfset SESSION.objWatchlist.init(session.addressid) />

到目前为止一切顺利。 init 函数如下所示:

<cffunction name="init" access="remote" output="false">
  <cfargument name="addressID" type="numeric" required="true" />
  <cfset THIS.ADDRESSID = arguments.addressID />
  <cfset THIS.WATCHLIST = arrayNew(1) />
  <cfset initWatchlistArray() />
  <cfreturn this />
</cffunction>

现在我想向 cffunction 添加另一个参数。我会这样称呼它:

<cfset SESSION.objWatchlist.init("addressid", session.addressid) />

<cfset SESSION.objWatchlist.init("sessionid", session.sessionid) />

我在 cffunction 中添加了一些新行:

<cffunction name="init" access="remote" output="false">
  <cfargument name="typeOfID" type="string" required="true" />
  <cfif arguments.typeOfID eq "addressid">
     <cfargument name="addressID" type="numeric" required="true" />
     <cfset THIS.ADDRESSID = arguments.addressID />
  <cfelseif arguments.typeOfID eq "sessionid">
     <cfargument name="sessionID" type="string" required="true" />
     <cfset THIS.SESSIONID = arguments.sessionID />
  </cfif>
  <cfset THIS.WATCHLIST = arrayNew(1) />
  <cfset initWatchlistArray() />
  <cfreturn this />
</cffunction>

但每次我收到错误“标签必须嵌套在 CFFUNCTION 标签内”。

现在我的问题是如何编写第二个参数基于第一个参数的函数?

这可能吗?

谢谢。

【问题讨论】:

  • 如果您要在this 范围内拥有变量,请在函数外部声明它们。您可以在函数内为它们赋值。关于实际问题,声明所有参数并将任何逻辑转移到函数的后面。
  • @DanBracuk:感谢您的回答。你有这方面的例子吗?
  • 有点跑题了。这种类型的代码应该在&lt;cfscript&gt; 中。它会更容易阅读。

标签: function coldfusion arguments


【解决方案1】:

评论太长了,但我对此进行了一些清理

SESSION.objWatchlist.init(addressID=session.addressid);
SESSION.objWatchlist.init(sessionID=session.sessionid);


any function init(numeric addressID, string sessionid) access="remote" output="false" {

   if (arguments.keyexists(("addressid"))    { THIS.ADDRESSID = arguments.addressID; }
   else if (arguments.keyexists("sessionid") { THIS.SESSIONID = arguments.sessionid; }

   THIS.WATCHLIST = [];
   initWatchlistArray();
   return this;
 }

注意:使用.keyexists()。这是一种更快的检查,因为它不必查看所有可能有匹配内容的范围。

还请注意,清空数组更容易。

【讨论】:

    【解决方案2】:

    最后我找到了一个看起来像这样的解决方案:

    首先我调用函数:

    <cfset SESSION.objWatchlist.init(addressID=session.addressid) />
    <cfset SESSION.objWatchlist.init(sessionID=session.sessionid) />
    

    我把函数改成如下:

    <cffunction name="init" access="remote" output="false">
      <cfargument name="addressID" type="numeric" required="false" />    
      <cfargument name="sessionID" type="string" required="false" />
      <cfif isDefined("arguments.addressid")>
        <cfset THIS.ADDRESSID = arguments.addressID />
      <cfelseif isDefined("arguments.sessionid")>
        <cfset THIS.SESSIONID = arguments.sessionid />
      </cfif>  
      <cfset THIS.WATCHLIST = arrayNew(1) />
      <cfset initWatchlistArray() />
      <cfreturn this />
    </cffunction>
    

    调用函数时,我可以使用 cffunction 中的参数名称调用它们。 之后我可以检查定义了哪一个。

    【讨论】:

    • 只是为了让您的更改更加清晰(我希望如此)。您最初的问题是 cfarguments 只能在函数顶部声明。它们不能嵌套在条件中。来自 cfargument 上的 Adob​​e 文档:“此标记必须位于 cffunction 标记中,位于 cffunction 标记正文中的任何其他标记之前。”这就是您收到错误的原因。我要指出的是,这个新代码可以同时接受 addressID 和 sessionID 参数,如果发生这种情况,则不会设置 sessionID,因为只有在未传递 arguments.addressID 时才会设置它。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多