6

好吧,我认为这几乎是不可能的。但是:是否可以在方法调用内部知道该方法是否作为函数调用的一部分被调用?

示例(以及我的实际函数调用):

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"]

..它被称为函数参数的一部分。

可能的?黑魔法?

在你来说我做错之前,我应该修复我的代码:我声称我有一种罕见的情况,知道这样的事情是有意义的。我正在编写一个查询生成器,这将大大简化嵌套条件的使用。否则我将不得不做一些愚蠢的nestedAndBegin 和后来的nestedAndEnd 来实现括号,等等。在这种情况下会很尴尬,我的查询构建器是基于树的,我不想这样做(与字符串杂耍查询构建器不同,所需的只是将逻辑表达式的节点放置到位)。

更新

所以这毫不奇怪是不可能的。对于那些对我如何解决我的特定问题感兴趣的人:我已经做到了,所以对函数的所有调用都被推迟了,所以对我的查询构建器的函数的调用将带有函数参数的方法调用对象放到调用列表中. 当时它不执行任何方法代码。每个调用对象都有一个 auto-inc 序列 ID,所以我知道何时评估了一个函数。现在在 nestedAnd 等函数中(所以我的问题是关于那些函数)我检查存储的调用对象的序列 ID 是否对应于函数调用的参数索引。如果没有,这是重新排序它们的正确时机。

然后将语法检查和查询构建阶段推迟到用户实际调用 query() 方法(或 ast() 以获取表达式树)。

4

1 回答 1

3

不,没有(实用的)方法可以做到这一点。

从理论上讲,您可以在方法中添加一些代码,从二进制文件中读取调试符号,检查链接寄存器,然后使用该信息找出调用站点,从其他地方加载源代码,并找出映射,解析源代码并确定它被称为您所描述的。

于 2013-07-09T18:28:50.573 回答