【问题标题】:Convert a string into closure in ColdFusion在 ColdFusion 中将字符串转换为闭包
【发布时间】:2014-07-15 12:04:27
【问题描述】:

我有一个非常基本的问题。是否可以将字符串转换为闭包?我尝试了评估(),但没有成功。

evaluate( "myFunction = function(val){ return dollarFormat( val ); }" );

我的想法是将数据库中的自定义函数保存为字符串,然后根据需要运行它。

谢谢!

编辑:澄清一下:我希望能够将“function(val){ return DollarFormat(val); }”作为字符串保存在数据库中,并能够将其转换为功能闭包。

【问题讨论】:

  • 这是用于 ColdFusion 还是 Railo,或两者兼而有之?我不能让它在任何一个上工作,但如果它是为 Railo 工作的,如果你在他们的 Google Group 上提问,你应该能够从 Railo 工程师那里得到权威的答案:groups.google.com/forum/#!forum/railo
  • 目前它用于 Railo 项目,但我也想将它用于 ColdFusion。我会把它贴在那里。谢谢。
  • 好的,这是 Railo Group 的答案:将字符串保存在 RAM 文件中,然后包含该文件。
  • 理论上通过 CF 也应该可以正常工作。

标签: coldfusion closures railo


【解决方案1】:

我遇到了类似的解决方案,但由于安全限制,我无法使用内存中的文件系统。在我的 Application.cfc 中,我添加了以下映射:

this.mappings = {
    "/models" = "#APP_ROOT_PATH#cfcs/models",
    "/utils" = "#APP_ROOT_PATH#cfcs/utils",
    "/modules" = "#APP_ROOT_PATH#_modules",
    "/components" = "#APP_ROOT_PATH#cfcs",
    "/udfs" = "#APP_ROOT_PATH#includes/udfs" // path for global (and temporary) UDFs
};

我创建的UDF如下:

/**
 * Takes a string representation of a function and returns it as a Closure
 * @output false
 * @return Closure
 */
private any function toClosure (required string closure) {
    local.id = replace(createUUID(), "-", "", "all");
    local.udfpath = "/udfs/udf#id#.cfm";
    local.script = "<cfscript>local.fn#id# = #closure#;</cfscript>";

    try {
        fileWrite(expandPath(udfPath), script);
        include udfpath;
    } catch (any e) {

    } finally {
        try {
            fileDelete(expandPath(udfPath));
        } catch (any e) {}
    }

    if (!structkeyExists(local, "fn#id#") || !isClosure(local["fn#id#"])) {
        throw (message="Unable to compile closure");    
    }

    // return the closure
    return local["fn#id#"];         
}

结果:

myFn = toClosure("function (num) { return num + 1; }");
myFn(1); // returns 2

【讨论】:

    【解决方案2】:

    我会选择 user2943775 答案:

    <cfscript>
    FileWrite("/ram/UDFs.cfm", "<cfset myFunction = function(val){ return dollarFormat( val ); }>")
    include template="/ram/UDFs.cfm";
    writedump(myFunction(10));
    </cfscript>
    

    在你的 Application.cfc 中

    component {
        this.mappings["/ram"] = "ram://";
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2013-11-18
      • 2014-03-15
      • 2016-06-23
      • 1970-01-01
      • 2018-05-02
      相关资源
      最近更新 更多