Если Вы понимаете, что процесс сохраняет/выпускает затем существует два золотых правила, которые "понятное дело" очевидны для установленных программистов Cocoa, но к сожалению редко разъясняются это ясно для вновь прибывших.
, Если функция, которая возвращает объект, имеет alloc
, create
или copy
на его имя затем, объект является Вашим. Необходимо звонить [object release]
, когда Вы закончены с ним. Или CFRelease(object)
, если это - объект Базовой Основы.
, Если это НЕ имеет одного из этих слов на его имя затем, объект принадлежит кому-то еще. Необходимо звонить [object retain]
, если Вы хотите сохранить объект после конца Вашей функции.
Вы были бы хорошо обслужены, чтобы также следовать этой конвенции в функциях, которые Вы создаете сами.
(Педанты: Да, существует, к сожалению, несколько вызовов API, которые являются исключениями к этим правилам, но они редки).
Это связано с тем, что переменные, встречающиеся на левой стороне генераторов, здесь X и Y, всегда являются новыми несвязанными переменными локальными для понимания. Это означает, что это не те же переменные, что и X и Y в заголовке троек, и, следовательно, неявный тест на равенство отсутствует. Это похоже на funs, где все переменные, встречающиеся в заголовке fun, также являются новыми переменными, локальными для fun.
Это отличается от большей части остальной части erlang, поэтому компилятор не только предупреждает, что X и Y в голове не используются, но также, что X и Y в понимании затеняют другие переменные. Они также нигде не используются в понимании.
Простой способ получить желаемое:
[ Result || Result = {X1,Y1,_} <- Self, X =:= X1, Y =:= Y1 ]