【问题标题】:Polymorphism in DW 2.0DW 2.0 中的多态性
【发布时间】:2020-11-23 19:17:48
【问题描述】:

我最近意识到在 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 Studio 运行预览时查看函数的信号

TIA!

【问题讨论】:

    标签: dataweave mule4


    【解决方案1】:

    parametric polymorphism 在 DataWeave 中最常见的用途之一是在类型系统函数中反映其返回类型取决于其输入。

    当实现相同且它们仅在签名上有所不同时,这有助于避免为每种可能的输入类型创建专门的函数。

    请注意,此功能仅在类型检查期间相关,此信息在运行时不携带。

    在你的例子中:

    • id1 将根据 id1 函数的用法推断出 a 的类型,还会推断出返回类型,因为它们没有被指定。
    • id2 将推断返回类型为 Any 类型
    • id3id4 是一样的,返回和 a 的类型取决于你调用函数的方式。

    要举例说明AnyT 之间的区别,您可以尝试:

    // var fails: String = id2("foo")
    var ok: String = id3("foo")
    

    由于id2 的结果不能分配给String,因为它是Any,但是id3 返回一个String,因为它被赋予了String 作为输入。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      相关资源
      最近更新 更多