Как выполнить несколько операторов в анонимной функции MATLAB?

Это не ответ на вопрос, как определить приоритет, но я могу решить вашу проблему . Я не думаю, что вам нужно использовать приоритет жестов, если к одному представлению не прикреплено два жеста. В вашем случае у вас есть два представления с их собственным жестом.

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

Я создал две простые коробки с жестами крана на детской площадке ...

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        let innerView = UIView()
        innerView.backgroundColor = UIColor.red

        view.addSubview(innerView)
        innerView.translatesAutoresizingMaskIntoConstraints = false
        innerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        innerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        innerView.widthAnchor.constraint(equalToConstant: 100).isActive = true
        innerView.heightAnchor.constraint(equalToConstant: 100).isActive = true

        self.view = view

        let outTapGesture = UITapGestureRecognizer(target: self, action: #selector(outterViewTapped))
        let innerTapGesture = UITapGestureRecognizer(target: self, action: #selector(innerViewTapped))

        view.addGestureRecognizer(outTapGesture)
        innerView.addGestureRecognizer(innerTapGesture)
    }

     @objc func outterViewTapped() {
       print("Outter tapped!")
     }

     @objc func innerViewTapped() {
       print("Inner tapped!")
     }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
43
задан gnovice 23 November 2010 в 15:27
поделиться

4 ответа

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

Первый, сделайте Ваш анонимные функции и поместите их дескрипторы в массив ячеек :

fcn1 = @() ...;
fcn2 = @() ...;
fcn3 = @() ...;
fcnArray = {fcn1 fcn2 fcn3};

... или, если у Вас есть функции, уже определенные (как в m-файлах), помещают указатели на функцию в массив ячеек как так:

fcnArray = {@fcn1 @fcn2 @fcn3};

Затем можно сделать новую анонимную функцию, которая вызывает каждую функцию в массиве с помощью встроенных функций cellfun и feval :

foo = @() cellfun(@feval,fcnArray);

, Хотя забавно выглядящий, это работает.

РЕДАКТИРОВАНИЕ: , Если бы функции в fcnArray потребность, которую назовут с входными параметрами, необходимо было бы сначала удостовериться, что ВСЕ функции в массиве требуют ТОГО ЖЕ количества исходных данных. В этом случае следующий пример показывает, как назвать массив функций с одним входным параметром каждым:

foo = @(x) cellfun(@feval,fcnArray,x);
inArgs = {1 'a' [1 2 3]};
foo(inArgs);  %# Passes 1 to fcn1, 'a' to fcn2, and [1 2 3] to fcn3


WORD OF WARNING: документация для [1 116] cellfun состояния, что порядок , в котором вычисляются выходные элементы, не указывают и нельзя положиться. Это означает, что нет никаких гарантий, который fcn1 оценен прежде fcn2 или fcn3. Если порядок имеет значение, вышеупомянутое решение не должно использоваться.

45
ответ дан gnovice 26 November 2019 в 23:00
поделиться

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

при определении этой анонимной функции в функции (не сценарий) можно создать названные внутренние функции. Внутренние функции имеют нормальную лексическую ссылочную привязку и позволяют произвольные числа операторов.

function F = createfcn(a,...)
  F = @myfunc;
  function b = myfunc(...)
    a = a+1; 
    b = a; 
  end
end

Иногда можно сойти с рук приемы как предложение gnovice.

Быть осторожным относительно использования оценки... это очень неэффективно (это обходит JIT), и оптимизатор Matlab может запутаться между переменными и функциями от внешнего объема, которые используются в выражении оценки. Также трудно отладить и/или код степени, который использует оценку

12
ответ дан Mr Fooz 26 November 2019 в 23:00
поделиться

Если functionCall1() и functionCall2() возврат что-то и те somethings могут быть связаны, то можно сделать это:

>> foo = @() [functionCall1(), functionCall2()]

или

>> foo = @() [functionCall1(); functionCall2()]

побочный эффект А этого состоит в том, что foo() возвратит конкатенацию любого functionCall1() и functionCall2() возврат.

я не знаю, гарантируется ли порядок выполнения functionCall1() и functionCall2().

1
ответ дан ManWithSleeve 26 November 2019 в 23:00
поделиться

Возможно, я пропускаю что-то, просто делаю функцию combinationCall, который вызывает обе функции для Вас.

0
ответ дан MatlabDoug 26 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: