2014-12-02 5 views
0

я хотел бы вызвать определенную функцию из анонимной функции, как и вMatlab: Вызов функции, которая не имеет выхода из анонимной функции

@(){fooBar(baz)} 

Проблема, fooBar не имеет выходов, что делает анонимная функция жалуется. Есть ли способ обойти это, кроме того, что функция fooBar возвращает фиктивный вывод?

ответ

5

Проблема заключается в определении анонимной функции. Заключив вашу функцию foobar(baz) между символами {...}, вы программируете функцию которая должна:

  • вычислить выражение foobar(baz)
  • Поместите результат этого выражения в возвращение cell
  • Клетка

Очевидно, что на этапе (2) Matlab не может поместить результат выражения (1) в ячейку, потому что из (1) нет выхода.

Так просто определить свою функцию без фигурных скобок:

myFunction = @() fooBar(baz) 

и все должно работать нормально.


Чтобы продемонстрировать на примере, давайте определим функцию fooBar, делая то, что не производит выход (изменить пределы топор, например):

fooBar = @(axlim) set(gca,'XLim',axlim) 

теперь я могу назвать fooBar([0 20]) и текущие оси будут иметь ограничения по осям, установленным на [0 20]

Если есть диапазон осей, который я часто использую ([-5 5]), у меня может возникнуть соблазн определить новую функцию, которая всегда будет вызывать fooBar с теми же самыми (часто используются) параметры:

fooBarPrefered = @() fooBar([-5 5]) 

Теперь каждый раз, когда я называю fooBarPrefered(), мои пределы оси X непосредственно установлен на [-5 5].


Для дальнейшего доказать точку, так как вызов fooBar([-5 5]) не производит выход, Matlab будет действительно жаловаться, если я определяю свою функцию с фигурными скобками:

fooBarPrefered = @() {fooBar([-5 5])} ; 
>> fooBarPrefered() 
One or more output arguments not assigned during call to "set". 
Error in @(axlim)set(gca,'XLim',axlim) 

Error in @(){fooBar([-5,5])} 

Но обратите внимание, что это та же ошибка чем если бы вы пытались присвоить выход fooBar переменной непосредственно в рабочем пространстве:

a = fooBar([0 20]) 
One or more output arguments not assigned during call to "set". 
Error in @(axlim)set(gca,'XLim',axlim) 

Нижняя строка: если функция не имеет выхода, не пытайтесь перенаправить этот вывод на переменную или выражение.

+0

очень хороший ответ +1! –

+0

О! Я думал, что эти фигурные скобки были частью синтаксиса анонимных функций.Он действительно работает без них. Благодаря! – kralyk

Смежные вопросы