使用参数值输入对的缩写 - 为什么cellfun的'UniformOutput', false可以作为'un', 0?

15
作为经常使用cellfun(..., 'UniformOutput', false)的用户,我很惊讶地发现后两个参数可以输入cellfun(..., 'un', 0)。这立即缩短了我的代码。我的问题是,是否还有其他类似的快捷方式/别名可用?
这似乎没有在MathWorks网站上记录下来。坏坏的!
2个回答

12

背景

属性-值对的属性部分通常可以缩短为属性字符串的开头,只要它仍然是唯一可识别的(请参见下面的示例)。它们也经常不区分大小写。
据我所知,这仅适用于图形属性以外的任何内容都没有记录在案(请点击此处了解详情)。

然而,在许多接受属性-值对参数的 The MathWorks 函数中,此行为也被实现,并且在某些接受没有值对的字符串参数的函数中也是如此。

问题在于其他有哪些属性...

  • 对于某些功能,文档记录不充分...(而许多是内置或模糊的 .p 文件,因此无法检查源码)。
  • 最重要的是,我们 无法知道未来版本是否会引入新的属性

出于这个原因,不建议使用缩短的属性名称,引用Matlab文档的话:

"如果由于添加了新属性而缩短名称不再唯一,则使用完整的属性名称可以防止 MATLAB 的未来版本出现问题。" - Matlab文档

"不要使用 P-V 缩写缩短代码,这是不值得的,相信我。" – Sam Roberts

稍微技术一点的说明——Matlab 的 inputParser 默认情况下实现了此功能,但可以通过禁用来使这些缩写不能在每个函数上正常工作。仅适用于以这种方式使用 inputParser 或专门编写允许此操作的函数。


使用图形属性的示例

  1. 简单缩写

以下

hFig = figure();
get(Hfig,'Visible')
ans =

on

可以缩短为

hFig = figure();
get(Hfig,'v')
ans =

on

因为它是唯一以'v'开头的属性(注意'vi''vis'等也可以起作用)。

  1. 唯一性

然而,其他类似地以相似方式开头的属性,如CurrentAxesCurrentCharacterCurrentObject

get(Hfig,'Current')

Error using get
Ambiguous property found.
Object Name: figure
Property Name: 'Current'.

'currenta''currentc''currento'是唯一可识别的,并且将按预期工作。

  1. 不可能缩短

特别提到像ColorColorMap这样的属性,其中一个名称是另一个的开头。 Color只能使用全名,因为任何缩写都可能与ColorMap产生歧义。 'ColorMap'可以缩写为'colorm',但如前所述。


反例

通过展示一些看似无法预测和意外行为的实例,本节旨在阻止使用缩短属性值对。

半文档化的hardcopy具有一些有趣的行为,文档将可能的选项说明为-dps,-deps,-dps2,-deps2,-dill,-dhpgl

然而,'-dh'会创建错误,而'-di'作为缩写的'-dill'有效,遗憾的是没有检查源代码以查看原因,因为它是.p文件

最后,cellfun本身并不完全遵循上述规则,'u'在理论上应该有效,但仅从'un'和以后才有效。


我应该补充一下,cellfun也会稍微打破这个规则,因为虽然'u'看起来是唯一可识别的,但它不起作用... - RTL
+1 我也有完全相同的怀疑。现在我看到了一个确认,或者至少是类似的意见。 - Luis Mendo
1
将脚本中的每个属性字符串缩短到最小限度,这将是一个有趣的恶作剧,可以玩弄那些试图调试函数的人 :) - sco1
2
PS 参数值缩写是一个非常糟糕的设计选择,我真的鼓励大家在他们的代码中永远不要使用或支持它们。想象一下,你编写了一些使用 cellfun(..., 'un', false) 的代码。在 MATLAB 的下一个版本中,MathWorks 引入了一个新选项到 cellfun 中,可能称之为 'Unit' - 这对他们来说是完全可以的,因为这不是现有的选项。突然间,你所有的代码都崩溃了,因为你使用的缩写不再是无歧义的。不要用 P-V 缩写缩短你的代码,相信我,这不值得。 - Sam Roberts
@SamRoberts,RTL 我会在答案中包含Sam的评论,或者Sam可以写一个新的评论。对我来说似乎非常重要。 - Robert Seifert
显示剩余3条评论

4
如果一个程序使用MATLAB的功能,则通常可以缩短任何参数名称,使其仍然不含歧义且不区分大小写。 对象的属性也是如此,例如get(gcf,'pos')get(gcf,'Position')的一个较短的版本。
但是,我不知道是否有关于这种用法的文档,建议您尝试并查看。
0通常等同于false(非零等于true)。
顺便说一下,在命令行中使用这些快捷方式很好,但在编写函数和脚本时最好使用全名。

明白了,非常感谢您的解释。我会去看一下inputParser以更深入地了解它。 - Derek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接