fn fn2 parameter1 parameter2 = (  -- 外层接收你的参数
    fn fn1 sender e = (  -- 内层必须带sender和e
        -- 这里直接用 自定义参数1、自定义参数2
        print("事件触发,参数1是:" + a as string)
        print("事件触发,参数2是:" + b as string)
    )
    result = fn1 parameter1 parameter2
    return result 
)
-- 正确调用函数并打印结果
print (fn2 3 4)

反馈:

fn2()
"事件触发,参数1是:undefined"
"事件触发,参数2是:undefined"
"事件触发,参数2是:undefined"
"事件触发,参数2是:undefined"

证明sender e 不能传参(只是在dontnet中用,e.Argument 可以传参)。

先要用 BgWorker.RunWorkerAsync #(参数1, 参数2) 发送参数,再在函数体内e.Argument[1],e.Argument[2]

改为


a=undefined
b=undefined
fn fn2 parameter1 parameter2 = (  -- 外层接收你的参数
    fn fn1 = (  
        -- 这里直接用 自定义参数1、自定义参数2
        print("事件触发,参数1是:" + a as string)
        print("事件触发,参数2是:" + b as string)
    )
    result = fn1 ()
    return result 
)
-- 正确调用函数并打印结果
print (fn2 3 4)

反馈:

fn2()
"事件触发,参数1是:undefined"
"事件触发,参数2是:undefined"
"事件触发,参数2是:undefined"
"事件触发,参数2是:undefined"

说明嵌套函数,并没有用。

 
a=undefined
b=undefined
fn fn2 parameter1 parameter2 = (  -- 外层接收你的参数
	parameter1 =a
	parameter2 =b
    fn fn1 = (  
        -- 这里直接用 自定义参数1、自定义参数2
        print("事件触发,参数1是:" + a as string)
        print("事件触发,参数2是:" + b as string)
    )
    result = fn1 ()
    return result 
)
-- 正确调用函数并打印结果
print (fn2 3 4)

说明里面的函数不透出参数的话,闭包传参,并没有用。(据说python可以,但这是maxscript)

改为内外函数都传参


fn fn2 parameter1 parameter2 = (  -- 外层接收你的参数
    fn fn1 a b = (  
        -- 这里直接用 自定义参数1、自定义参数2
        print("事件触发,参数1是:" + a as string)
        print("事件触发,参数2是:" + b as string)
    )
    result = fn1 parameter1 parameter2
    return result 
)
-- 正确调用函数并打印结果
print (fn2 3 4)

反馈:

fn2()
"事件触发,参数1是:3"
"事件触发,参数2是:4"
"事件触发,参数2是:4"
"事件触发,参数2是:4"

可问题是不管是
 DotNet.AddEventHandler worker "DoWork" workerFunc   要求带 sender事件源,e 事件参数,无传参

dotnetobject "System.Threading.ThreadStart" threadFunc   要求函数无参数、无返回值

不接受传参函数,所以具体的参数都透不进去。白搭!~

提示错误

-- Runtime error: No constructor found which matched argument list: System.Threading.ThreadStart

再看一个实例

-- 外部函数
fn outFn a =
(
    local outerVar = a * 2  -- 外部函数的局部变量

    -- 内部函数(闭包)
    fn inFn b =
    (
        -- 内部函数可以访问 outerVar
        local result = outerVar + b
        format "外部变量 outerVar = %\n" outerVar
        format "内部参数 b = %\n" b
        format "计算结果 result = %\n" result
        return result
    )

    return inFn -- 返回内部函数
)

-- 使用闭包
f = outFn 5  
f 3 

-- 匿名 codeblock; 文件名: ; 位置: 190; line: 10 中发生错误
-- 编译错误: 此处不允许使用外部局部变量引用:  outerVar
--  所在行:         local result = outerVar +

对,MaxScript 的闭包支持非常有限,它不允许内部函数直接引用外部函数的局部变量。你看到的错误就是这个原因:

编译错误: 此处不允许使用外部局部变量引用: outerVar

所以在 MaxScript 中,如果你想让内部函数访问“外部变量”,必须通过参数传递或者全局变量,而不能像 Python/JavaScript 那样直接闭包捕获。

-- 外部函数
fn outFn a =
(
    local outerVar = a * 2  -- 外部变量

    -- 内部函数通过参数传递
    fn inFn b outVar =
    (
        local result = outVar + b
        format "外部变量 outerVar = %\n" outVar
        format "内部参数 b = %\n" b
        format "计算结果 result = %\n" result
        return result
    )

    return inFn  -- 返回函数
)

f = outFn 5
f 3 10  -- 注意这里要传 outerVar

理解:第一个f是外部函数outFN,参数是5,第二个f是内部函数inFn参数两个是3和10

结构体内传参

struct strA
(
    AAA,
    fn fnA  =
    (
        format "获得: %\n" this.AAA
    )
)
bbb = strA aaa:10
bbb.fnA()

反馈:

#Struct:strA(
  AAA:<data>; Public,
  fnA:<fn>; Public)
(strA AAA:10)
获得: 10
OK

理解:bbb = strA是把bbb赋给strA,而 AAA:10 是给AAA填入值10 ,bbb.fnA()是调用strA里的fnA()函数并执行

结构体外传参

struct strA (
    taskID,
    taskName,
    priority
)
global g_strA = strA 2, "材质计算", "中"
fn fnA = (
	print ("当前任务ID: " + strA.taskID as string)
    print ("任务名称: " + strA.taskName)
	print ("任务优先级: " + strA.priority)
	format "获得: %\n" g_strA.AAA
)
onTaskEvent

-- 匿名 codeblock; 文件名: ; 位置: 92; line: 7 中发生错误
-- 语法错误: 位于 string,需要 name
--  所在行: global g_strA = strA 2, "材质计算",

的写法在 结构体实例化 部分语法错了。MaxScript 的 struct 实例化必须用 关键字参数,不能像函数那样直接写逗号分隔值。


struct strA (
    taskID,
    taskName,
    priority
)
global g_strA = strA taskID:2 taskName:"材质计算" priority:"中"
fn fnA = (
	print ("当前任务ID: " + g_strA.taskID as string)
    print ("任务名称: " + g_strA.taskName)
	print ("任务优先级: " + g_strA.priority)
-- 	format "获得: %\n" g_strA.taskName
)
fnA()

输出结果:

#Struct:strA(
  taskID:<data>; Public,
  taskName:<data>; Public,
  Priority:<data>; Public)
(strA taskID:2 taskName:"材质计算" Priority:"中")
fnA()
"当前任务ID: 2"
"任务名称: 材质计算"
"任务优先级: 中"
"任务优先级: 中"

那有了结构体,全局函数申明不也是多余的吗?


struct strA (
    taskID,
    taskName,
    priority
)
g_strA = strA taskID:2 taskName:"材质计算" priority:"中"
fn fnA = (
	print ("当前任务ID: " + g_strA.taskID as string)
    print ("任务名称: " + g_strA.taskName)
	print ("任务优先级: " + g_strA.priority)
 	format "获得: %\n" g_strA.taskName
)
fnA()

反馈:

#Struct:strA(
  taskID:<data>; Public,
  taskName:<data>; Public,
  Priority:<data>; Public)
(strA taskID:2 taskName:"材质计算" Priority:"中")
fnA()
"当前任务ID: 2"
"任务名称: 材质计算"
"任务优先级: 中"

获得: 材质计算
OK

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐