#dataweave #mule4
Вопрос:
Недавно мне стало известно о нотации, подобной дженерикам, для обозначения полиморфных типов в DW 2.0.
Пример ниже
%dw 2.0
output application/dw
fun id1(a) = a
fun id2(a: Any) = a
fun id3<T>(a: T) = a
var id4 = <T>(a: T) -> a
---
{
"d1": id1,
"d2": id2,
"d3": id3,
"d4": id4,
r1: id1(10),
r2: id2(10),
r3: id3(10),
r4: id4(10)
}
Иллюстрирует, что сигнатуры и семантика этих функций одинаковы.
В связи с этим возникает вопрос, в чем разница между этими определениями, если таковые имеются? Какой из них вы бы порекомендовали?
Наконец, подтвердите мое предположение о том, что DW 2.0 заимствовал этот синтаксис, подобный типам, который встречается в языках OO, для поддержки явных полиморфных типов.
ПРИМЕЧАНИЕ: я использовал application/dw
для того, чтобы увидеть сигнатуры функций во время предварительного просмотра из студии Anypoint
ТИА!
Ответ №1:
Одним из наиболее распространенных применений parametric polymorphism
в DataWeave является отражение в функциях системы типов, где тип возвращаемого значения зависит от его ввода.
Это полезно, чтобы избежать необходимости создавать специализированные функции для каждого возможного типа ввода, когда реализация будет одинаковой и они будут отличаться только своими сигнатурами.
Обратите внимание, что эта функция актуальна только во время проверки типа, эта информация не передается во время выполнения.
В вашем примере:
id1
будет выводить как типa
из использованияid1
функции, так и тип возвращаемого значения, поскольку они не были указаны.id2
сделает вывод, что тип возвращаемого значения имеет типAny
id3
иid4
то же самое, тип возврата иa
будет зависеть от того, с помощью чего вы вызываете функцию.
Чтобы проиллюстрировать разницу между Any
и T
вы могли бы попробовать:
// var fails: String = id2("foo")
var ok: String = id3("foo")
Так как результат id2
не может быть назначен a String
, так как он Any
есть, но id3
возвращает a String
, потому что ему было дано a String
в качестве входных данных.