Merge arguments and local scope

Here’s a very simple example using arrays. Since arrays & structs are mutated, I duplicate them in the local scope and am then able to return both for debug purposes.

<cfscript>
array function testLocal(required array a) {
    local["a"] = duplicate(arguments.a); // duplicate as local to prevent mutation
    arraysort(local.a, "textnocase");
    return local. A;
}
array function testNoLocal(required array a) {
    // duplicate required to prevent mutation of original var
    // but original arg value is lost & unavailable for debugging
    // arguments.a = duplicate(arguments.a);
    arraysort(arguments.a, "textnocase");
    return arguments.a;
}

struct function testDebug(required array a) {
    local["a"] = duplicate(arguments.a);  // duplicate to prevent mutation & enable easier debugging
    arraysort(local.a, "textnocase");
    return [
        "result": local.a,
        "debug": [
            "local": local,
            "arguments": arguments
        ]
    ];
}

writeoutput("<h2>Using local</h2>");
data = ["c", "b", "a"];
writedump(var=testLocal(data), label="should be a,b,c");
writedump(var=data, label="should be c,b,a");

writeoutput("<h2>Solely using arguments</h2>");
data = ["c", "b", "a"];
writedump(var=testNoLocal(data), label="should be a,b,c");
writedump(var=data, label="should be c,b,a");

writeoutput("<h2>Separate local & argument scopes returned for debugging</h2>");
data = ["c", "b", "a"];
writedump(var=testDebug(data), label="should be a,b,c");
writedump(var=data, label="result should be c,b,a");
</cfscript>
2 Likes

This sounds like a good way of dealing with this. Thumbs up.