maxscript内外双函数传参(闭包传参),结构体传参(AI)(已验证)
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
更多推荐
所有评论(0)