Использование аббревиатур для пар входных пар параметров - почему cellfun `` UniformOutput ', false` работают как `` un', 0`?

Как частый пользователь cellfun(..., 'UniformOutput', false), я с удивлением обнаружил, что последние два аргумента могут быть введены как cellfun(..., 'un', 0). Это сразу сократило мой код. Мой вопрос в том, есть ли там другие подобные ярлыки/псевдонимы?

Это не похоже на документацию на веб-сайте MathWorks. Непослушный!

Ответы

Ответ 1

Фон

Часть свойств пары Property-value часто может быть сокращена до начала строки свойств до тех пор, пока она все еще однозначно идентифицируется (см. примеры ниже). Они также часто не чувствительны к регистру.
Насколько я знаю, это не документировано ничем иным, кроме свойств фигуры, где он очень кратко документирован.

Однако это поведение также реализовано во многих функциях MathWorks, которые принимают аргументы пары свойств и значений, а также в некоторых функциях, которые принимают строковые аргументы без пары значений.

Проблемы становятся тем, что есть другие свойства...

  • Для некоторых функций недостаточно хорошо документировано... (и многие из них встроенные или обфусканные .p файлы, поэтому не проверяйте источник).
  • Самое главное, что мы не можем знать, свойства.

Использование сокращенных имен свойств рекомендуется по этой причине, чтобы процитировать

", используя полное имя свойства, может предотвратить проблемы с выпуском фьючерсов MATLAB, если сокращенное имя больше не уникально из-за добавления новых свойств." - Документация Matlab

"Не сокращайте свой код с помощью сокращений P-V, это не стоит, поверьте мне". - Сэм Робертс

Краткая техническая сторона. Эта функциональность реализована по умолчанию Matlabs inputParser, однако ее можно отключить, чтобы эти сокращения никоим образом не гарантировали работу над каждой функцией. Только те, которые используют inputParser таким образом или специально написаны, чтобы разрешить это.


Примеры с использованием свойств фигуры

  • Простое сокращение

Следующие

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

on

можно сократить до

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

on

поскольку это единственное свойство, начинающееся с 'v' (обратите внимание, что 'vi', 'vis' и т.д. также работают)

  1. Единственность

Однако другие свойства, которые начинаются аналогично, например, CurrentAxes, CurrentCharacter и CurrentObject

get(Hfig,'Current')

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

Где в качестве 'currenta', 'currentc' и 'currento' однозначно идентифицируются и будут работать как предполагалось

  1. Невозможно сократить

Особое упоминание о свойствах, таких как Color и ColorMap, имя одного - это начало другого Color может использоваться только со своим полным именем из-за того, что любое сокращение является двусмысленным с ColorMap 'ColorMap' может быть закорочен до 'colorm', как и раньше.


Примеры счетчиков

Этот раздел предназначен для обескуражить использование сокращенных пар значений свойств, показывая некоторые из кажущихся непредсказуемым и неожиданным поведением.

В полу-недокументированном hardcopy есть интересное поведение, в документации указаны возможные варианты: -dps, -deps, -dps2, -deps2, -dill, -dhpgl

Однако '-dh' создает ошибку, когда '-di' работает как сокращенный '-dill' грустно, нет проверки источника, чтобы узнать, почему, поскольку это файл .p)

Наконец, cellfun сам точно не соблюдает правила, поскольку 'u' должен теоретически работать, если следовать правилам выше, однако только 'un' и далее.

Ответ 2

Если в подпрограмме используется функция MATLAB inputParser, тогда обычно любое имя параметра может быть сокращено, так что оно все еще недвусмысленно и согласовано с регистром незаметно. То же самое верно для свойств объектов, таких как get(gcf, 'pos'), как более короткая версия get(gcf, 'Position').

Однако я не знаю, есть ли какая-либо документация по этому использованию, и я предлагаю вам попробовать и посмотреть.

И 0 обычно эквивалентен false (ненулевое значение true).

PS Я бы предположил, что использование этих ярлыков отлично в командной строке, но при написании функций и скриптов лучше использовать полные имена.