propertyFunction多参数用法

PFunc支持多个参数,不过他的写法不是?Person f:Next(name) ?x.}这种格式,而是subject和object都支持list的格式。比如官方的concat函数?var apf:concat (arg arg ...)

通过添加一个括号,将object组成一组,传入一个 PropFuncArg objArg.PropFuncArg类有两成员变量,分别是private List<Node> argList = null ;private Node arg = null ;

下面看一下concat的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class concat extends PFuncSimpleAndList
{
@Override
public QueryIterator execEvaluated(Binding binding, Node subject, Node predicate, PropFuncArg object, ExecutionContext execCxt)
{
if ( ! Var.isVar(subject) )
throw new ExprEvalException("Subject is not a variable ("+subject+")") ;
String x = "" ;
for ( Node node : object.getArgList() )
{
if ( Var.isVar(node) )
return IterLib.noResults(execCxt) ;
String str = NodeFunctions.str(node) ;
x = x+str ;
}
return IterLib.oneResult(binding, Var.alloc(subject), NodeFactory.createLiteral(x), execCxt) ;
}
}

object可以通过getArgList的方式拿到所有的参数。

自己实现的时候直接重写public final QueryIterator execEvaluated(Binding binding, PropFuncArg argSubject, Node predicate, PropFuncArg argObject, ExecutionContext execCxt)即可。

更进一步,参数的包装是在PropertyFunctionGenerator.compilePattern中,有个findPropertyFunctionArgs专门处理list。


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2016/04/28/propertyFunction多参数用法/