Хорошо, я думаю, что это почти невозможно. Но тем не менее: возможно ли знать внутри вызова метода, если метод был вызван как часть вызова функции?Узнайте, является ли аргумент функции частью вызова функции
Пример (и мой фактический вызов функции):
HDMExpressionSQLSelectBuilder *sb = [[[HDMExpressionSQLSelectBuilder alloc] init] autorelease];
[sb orNestedWhere:[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"], [sb where:@"wheraCoumnB" equals:@"sth"], nil];
Есть две вещи, которые происходят здесь на:
- аргументы оцениваются в любом порядке (в каком порядке не указано в стандарте C и изменяется между компиляторами и настройками )
- Хотя это должно быть очевидно для каждого программиста: внутренние функции оценены до
Теперь я хочу знать, например, внутри этого вызова метода ...
[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"]
.. что она была вызвана как часть аргумента функции.
Возможно? Черная магия?
Прежде чем вы придете и скажете, что я делаю это неправильно, и я должен исправить свой код: я утверждаю, что у меня есть один из редких случаев, когда имеет смысл знать такое. Я пишу построитель запросов, и это значительно облегчит использование вложенных условий. В противном случае мне нужно было бы сделать глупый вложенныйAndBegin и позже nestedAndEnd, чтобы реализовать скобки и т. Д. В этом случае было бы неудобно, мой построитель запросов основан на деревьях, и я бы не хотел этого делать (в отличие от строковых сборщиков запросов, которые потребуются, нужно поместить узел для логического выражения).
Update
Так что это не удивительно, не возможно. Для тех, кому интересно, как я работал над этим для своей конкретной проблемы: я сделал так, чтобы все вызовы функций откладывались, поэтому вызовы функции моего построителя запросов помещают объект вызова метода с аргументами функции в список вызовов , В то время он не выполняет какой-либо код метода. Каждый объект вызова имеет идентификатор последовательности с автоматическим включением, поэтому я знаю, когда функция была оценена. Теперь в функциях nestedAnd и т. Д. (Так что те функции, о которых мой вопрос был), я проверяю, соответствует ли идентификатор последовательности хранящихся объектов вызова индексу аргумента вызова функции. Если нет, это подходящее время для их изменения.
Фаза проверки синтаксиса и построения запроса затем откладывается до тех пор, пока пользователь фактически не вызовет метод query() (или ast(), чтобы получить дерево выражений).
Я считаю, что это правильный ответ, но, возможно, кто-то знает о возможном обходном пути. В противном случае я мог бы добавить какой-то журнал транзакций, который бы изменил бы последние изменения на внутренние функции и повторно применил их в правильном порядке в момент вызова внешней функции.Но, к сожалению, это означало бы разрыв с некоторыми возможностями проверки правильности построения запроса. – benjist
Вы также можете передавать селектора и аргументы. –
га, может быть, все. Я мог бы, вместо построения дерева напрямую, собрать все (копии) аргументов и селекторов. и применять их в правильном порядке, когда запрашивается строка запроса (в том числе проверка синтаксиса, хотя в более поздней точке) – benjist