Цепочка может уходить весьма глубоко, можно например
for (i : $node.interfaces) {
println(i.peerInterface.node.name);
}
Не обязательно писать цепочкой, можно раскапывать по одному шагу и сохранять в переменные:
for (i : $node.interfaces) {
p = i.peerInterface;
n = p.node;
name = n.name;
println(name);
}
но может оказаться, что в этой цепочке какой-то атрибут является null, а не объектом, и тогда все ломается в примере выше, если переменная p будет null, то в следующей строчке, где мы делаем p.node, то есть пытаемся получить атрибут node мы не можем этого сделать, потому что у null нет такого атрибута. Чтоб не ломалось, можно делать проверки в тех местах, которые могут оказаться null, например peerInterface:
for (i : $node.interfaces) {
p = i.peerInterface;
if (p != null) {
println(p.node.name);
}
}
Или использовать новый синтаксис, появившийся в версии 4.5, называется это safe dereference и если кто-то и окажется null, то попытка обратиться к его атрибуту не завершится ошибкой. Но .? должыть быть в цепочке начиная с первого места, которое может оказаться null и до конца цепочки:
for (i : $node.interfaces) {
println(i.peerInterface?.node?.name);
}
Peer ноды определяются во время topology poll