本帖最后由 qzwqzw 于 2012-11-13 10:30 编辑
“使用子函数的标签名作为返回值变量名”所带来的变量遍历效率问题
与程序中实际调用的子函数的个数有线性关系
在该个数未达到一定的数量级时对效率的影响应该比较有限
当然如何应用标签名以及如何处理标签名中的:是个需要考虑的问题
“固定变量名作为传递运算结果的“中介”,赋值多了一次”
如果是海量级的递归调用确实会有比较显著的影响
此种情况下应该允许该函数使用参数作为函数返回值变量名
此种情况可以看作是函数使用了一个变量指针作为实参
不将它看作返回值变量
因此不会影响整体的函数调用接口的约定
“对于返回多个结果”
可以参考一般高级语言的几种处理方式
一是将所有结果以伪数组的方式存入单一环境变量- setlocal
- set test1=value1
- set test2=value2
- set test3=value3
- endlocal & set ret=%test1% %test2% %test3%
-
- for %%e in (%ret%) do echo %%e
复制代码 二是将所有结果的指针存入单一环境变量- setlocal
- set test1=value1
- set test2=value2
- set test3=value3
- endlocal & (
- set "ret=test1 test2 test3"
- set test1=%test1%
- set test2=%test2%
- set test3=%test3%
- )
-
- setlocal EnableDelayedExpansion
- for %%e in (%ret%) do echo %%e=!%%e!
复制代码 “指示程序自身路径的变量”
这个可以不用%0%
可以使用其它约定的名称
这种用法也是我发帖时临时构造的
没有考虑到解析错误的问题
“子函数在什么情况非得递归父脚本?”
这分为两个方面
1-%0是用来递归调用子函数自身而非父脚本
这在子函数内部用到shift处理参数数组时可能会用到
当然这种情况一般在子函数内部处理
未必属于接口约定的范畴
2-递归父脚本的情况还是会有的
“递归”严格的来说应该是callback(回调)
比如我在上面提到的错误抛出问题
这是一个典型的需要回调父脚本的情况
因为同一个函数中的同一类错误
在不同的脚本环境中可能需要不同方式的处理
所以把错误转交给父脚本处理是一般性的选择
而此时的%0一般会被定位成子函数的标签名
而为了保证错误抛出后不再会被return
也无法使用类似call :main的形式
所以需要一个指示主函数或者父脚本路径的变量
对于返回的错误代码
还是建议尽量以exit /b number形式
利用系统内置的errorlevel吧 |