rebol - 如何使用默认参数构造函数
问题描述
为了使用默认参数创建一个函数,我尝试了这个:
f: function [a b] [either unset? :b [a + 1] [a + b]]
f 5
f 3 5
然后我收到这条消息*** Script Error: f is missing its b argument
。
那么,我该怎么办?
解决方案
实现一些内置函数使用的可变参数函数有一个技巧,最值得注意的是help
:
>> ? help
...
ARGUMENTS:
'word [any-type!]
将您的论点指定为引用并属于any-type!
排版。或者,或者,列出允许的类型并包含unset!
在其中。
>> foo: func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
== func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
>> foo 5
== 6
>> foo 3 5
== 8
然而,这需要付出一定的代价:
- 可选参数必须在强制参数之后连续出现。
- 脚本中的所有此类函数调用现在都需要用括号括起来,否则解释器无法猜测可变参数表达式的结束位置。
- 你失去了类型检查的好处,因为
any-type!
接受任何参数;'
在参数前面还强制执行特定的语义,这使得这种可变参数函数更加麻烦。 - 您的代码变得单一:解决可选参数需求的传统方法是通过改进。可变参数函数通常使用单个
block!
参数实现,甚至可能是方言的。
这种方法仅适用于面向用户的多态函数,旨在从命令行提示符(help
例如符号),即使这样,可选参数的数量也保持在最低限度。
推荐阅读
- ios - 如何在 WKWebView iOS 中进入全屏模式?
- powershell - 使用 Power shell 脚本捕获 SSAS 连接字符串和 SSAS 表格名称详细信息
- python - 确定通过 USB 连接的 Nikon d5300 相机的路径
- c++ - 跨 C/C++ 编译器将 FLT_MAX 转换为 unsigned char 时的不同结果
- jquery - 为什么数据表不显示从响应的 ajax 排序的数据?
- c++ - 如何确定嵌套循环的时间复杂度?
- rhel - 为什么 CDAP 不能在 RHEL 版本的 NodeJs 上运行?
- three.js - 如何使用 THREE.JS 向 3d 汽车模型添加一些平滑过渡?
- gnuplot - 在 gnu plot 中使用不同的线绘制不同的数据集
- html - 输入无线电检查