Я новичок в OGNL, поэтому извиняюсь, если я иду по проторенному пути или моя терминология неверна.
Я изо всех сил пытаюсь понять, как # это должно вести себя при проецировании по списку. Кажется, он ведет себя по-разному в зависимости от того, как он используется. Я ожидаю, что следующее выражение вернет [bar, bar, bar]
, но оно вернет [null, null, bar]
?
Root:
#{ “pet”: “dog” }
Выражение:
#testMap = #{ "foo": "bar" },
#testLookup = :[ #testMap[#this] ],
{ "foo" }.{ { #testMap[#this], #testMap.get(#this), #testLookup(#this) } }[0]
Если я добавить оператор печати в проекцию:
#testMap = #{ "foo": "bar" },
#testLookup = :[ #testMap[#this] ],
{ "foo" }.{ @java.lang.System@out.println(#this), { #testMap[#this], #testMap.get(#this), #testLookup(#this) } }[0]
Он печатает root:
{ pet=dog }
Если я добавлю присвоение к локальной переменной, он вернет [bar, bar, bar]
, как и ожидалось:
#testMap = #{ "foo": "bar" },
#testLookup = :[ #testMap[#this] ],
{ "foo" }.{ #temp = #this, { #testMap[#temp], #testMap.get(#temp), #testLookup(#temp) } }[0]
Я прочитал язык spe c и не могу понять, почему он ведёт себя так: # Похоже, что это вычисляет текущий элемент при вызове лямбды и root при доступе свойство или вызов метода. Я также отмечаю, что в лямбде он ведет себя как положено. Я надеюсь, что кто-то с большим опытом работы с OGNL сможет объяснить.
Я использую OGNL 3.2.12 из простого тестового набора, который оценивает root (с пустым root) и затем использует root при оценке выражения.