У меня есть код Java, который я пытаюсь перевести на vb.net. Он использует «предикаты», функцию, о которой я не знал до сих пор, но которая существует и в vb.net.
Итак, я прочитал документацию по нему, но ни один из них не объясняет код Java, который у меня есть, в частности, если у вас есть переменная «p», объявленная как предикат, что делает p.arity, и что делает p.arg (0) и p.arg(1) вернуть?
У меня сложилось общее впечатление, что предикат берет набор объектов и возвращает подмножество, соответствующее определенному критерию (например, учитывая набор всех баскетболистов, возвращать только тех, кто выше 6 футов ростом). Но следующий код, похоже, не имеет к этому никакого отношения:
// st is assumed to be a list of ECHO predicates
//
private void parseInput(StreamTokenizer st) throws IOException
{
while (st.nextToken() != StreamTokenizer.TT_EOF) {
st.pushBack();
Predicate p = new Predicate(st);
parsePredicate(p);
} // while
}
// PRE: p is non-null
// POST: performs the additions to the ECHO graph required by the
// ECHO predicate; if p is not a legal ECHO predicate, an
// IOException is thrown
//
private void parsePredicate(Predicate p) throws IOException
{
Assert.notNull(p);
String name = p.name();
if (name.equalsIgnoreCase(explainPred)) {
parseExplain(p);
} else if (name.equalsIgnoreCase(dataPred)) {
parseData(p);
} else if (name.equalsIgnoreCase(contradictPred)) {
parseContradict(p);
} else if (name.equalsIgnoreCase(analogyPred)) {
parseAnalogy(p);
} else if (name.equalsIgnoreCase(propositionPred)) {
parseProposition(p);
} else {
throw new IOException("ECHO: "+name+" is not a legal predicate name. "+
"Must be one of "+explainPred+", "+dataPred+", "+
contradictPred+", or "+analogyPred);
} // if
}
//
// PRE: p's name is explainPred
// POST: adds the given explanation predicate to ECHO, adding all necessary
// links; throws an exception if p is not a legal explains predicate
//
private void parseExplain(Predicate p) throws IOException
{
//msg("in parseExplain...");
int arity = p.arity();
float weight;
List propList;
String explainee;
if (arity == 2) {
//msg("arity == 2");
propList = (List)p.arg(0);
explainee = (String)p.arg(1);
weight = (float)explainWeight(propList.length());
} else if (arity == 3) {
//msg("arity == 3");
propList = (List)p.arg(0);
explainee = (String)p.arg(1);
float strength = Float.valueOf((String)p.arg(2)).floatValue();
weight = (float)(strength*explainWeight(propList.length()));
} else {
throw new IOException("ECHO: an explains predicate must have 2 or 3 "+
"arguments: "+p);
} // if
Используемый здесь класс Predicate
не имеет ничего общего со стандартом Java java.util.function.Predicate
. Это дело Майкрософт?
Я заметил, что в начале кода есть следующее: import predicate.*; У него нет префикса java, так что, возможно, это специально написанная библиотека java, которая, к сожалению, имеет то же имя, что и функция Java?
В этом случае я предполагаю следующее:
арность — это количество параметров, которые принимает функция. Вы можете видеть, что после проверки, равна ли арность 2, он считывает два аргумента (arg(0) и arg(1)). Таким образом, arg — это просто метод получения параметра/аргумента по заданному индексу.
Затем, когда арность равна 3, вы можете получить три аргумента; 0, 1, 2
Вы должны выяснить, что такое
Predicate
, так как javadoc не упоминает о существовании методовarity
иarg
, поэтому, вероятно, он не является частью стандартной кодовой базы Java.