Optional
patt:def 或 Optional[patt,def]
是一个模式对象,表示如果省略了形为 patt 的表达式,应使用默认值 def 进行替换.
更多信息
- Optional 用于在一个由模式表示的函数中指定"可选参数". 模式对象 patt 在如果有参数的情况下,则给出参数应当有的形式. 如果没有参数,表达式 def 给出缺省值来使用.
- 形式 s_:def 等价于 Optional[s_,def]. 这个形式也等价于 s:_:def. 在这种情况下,由于 s 必须是一个符号,因而没有任何语法歧义. »
- 特殊形式 s_. 等价于 Optional[s_],可以用于表示函数参数,如果忽略,则应当用它们所在函数指定的全局缺省值替换. »
- 当 _. 作为 f 的参数,Default[f,…] 的值指定所使用缺省值. 在 _. 首次作为 f 的参数出现之前,必须对Default[f,…] 赋值. »
- Optional[s_h] 表示可以忽略的函数,但如果是当前函数,必须有头部 h. 这种情况下没有任何更简单的句法形式. »
- Optional[s_h,def] 中的值 def 不必具有标头 h. 更广泛地说,默认值不需要匹配实际存在的可选参数的任何模式要求. »
- 有内置缺省值的函数包括 Plus、Times 和 Power. »
- Longest 和 Shortest 在与 Optional 组合时有特殊含义. Longest[patt:def] 表示首先尝试使用 patt,然后才尝试使用 def. Shortest[patt:def] 则相反,首先尝试使用 def,然后才尝试使用 patt.
- 如果在使用 Optional 时没有明确说明 Longest 或 Shortest,则实际上封装在 Longest 中.
范例
打开所有单元关闭所有单元范围 (5)
在任何模式匹配函数中都可使用 Optional,包括 ReplaceAll:
以及 MatchQ:
使用 Optional 和 BlankSequence:
属性和关系 (6)
三元形式 sym:pat:def 的头部为 Optional:
如果没有给出明确的默认值,则从头部的 DefaultValues 中推断出默认值:
1 来自 DefaultValues[Times]:
缩写形式 x_. 等价于 Optional[Pattern[x,Blank[]]:
当限制一个默认参数时,模式将完全无法匹配一个不符合要求的参数:
Optional 不会阻止默认值的计算:
使用 HoldPattern 将默认值的计算延迟到其被使用时:
使用 BlankSequence 和 Optional 定义一个函数;该函数使用默认值进行计算:
使用 BlankNullSequence 定义一个函数;该函数在计算时不使用任何值:
由于 BlankNullSequence 匹配的参数长度为零,所以 x___:d 形式永远不会使用 d:
可能存在的问题 (3)
只有当 s 是 Blank[…] 或 Pattern[sym,Blank[…]] 的特殊输入形式时,输入 s:v 才有头部 Optional:
也允许 BlankSequence[…] 和 BlankNullSequence[…]:
如果 s 是一个符号,那么 s:v 代表 Pattern[s,v]:
Condition 和 PatternTest 不能应用于 Optional:
取而代之的是,对 Optional 的第一个参数应用该检验:
无论给定的参数是零还是一个,函数 f 和 g 的行为都符合期望:
取而代之的是,把模式放在 Optional 的第一个参数里面:
注意,Optional 对象可以用三元形式 s:p:d 写得更简洁:
文本
Wolfram Research (1988),Optional,Wolfram 语言函数,https://reference.wolfram.com/language/ref/Optional.html (更新于 2015 年).
CMS
Wolfram 语言. 1988. "Optional." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2015. https://reference.wolfram.com/language/ref/Optional.html.
APA
Wolfram 语言. (1988). Optional. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/Optional.html 年