代码之家  ›  专栏  ›  技术社区  ›  Adam Rabung

结构类型的实际用途?

  •  12
  • Adam Rabung  · 技术社区  · 15 年前

    结构类型是“哇,酷!”斯卡拉的特点。然而,对于每一个例子,我都能想到它们可能在哪里帮助,隐式转换和动态混合组合似乎更像是更好的匹配。它们的一些常见用途和/或何时合适的建议是什么?

    4 回复  |  直到 15 年前
        1
  •  13
  •   Vasil Remeniuk    15 年前

    除了少数提供相同方法但不相关或不实现公共接口(例如 close() Source 一方面,它没有延伸 Closeable ),我发现结构类型没有使用它们当前的限制。但是,如果他们更灵活,我就可以写出这样的东西:

    def add[T: { def +(x: T): T }](a: T, b: T) = a + b
    

    编辑

    不管我自己发现结构类型有多不实用 但是,使用它来处理匿名类。例如:

    implicit def toTimes(count: Int) = new {
      def times(block: => Unit) = 1 to count foreach { _ => block }
    }
    
    5 times { println("This uses structural types!") }
    

    由(隐式)产生的对象 toTimes(5) 属于类型 { def times(block: => Unit) } ,即结构类型。

        2
  •  3
  •   jamie    15 年前

    结构类型是Scala中非常酷的构造。我使用它们来表示多个不相关的类型,这些类型共享一个属性,我希望在没有新抽象级别的情况下对其执行公共操作。

    我从那些对应用程序架构要求严格的人那里听到了一个反对结构类型的论点。他们觉得在没有关联特征或父类型的类型之间应用一个公共操作是危险的,因为然后你就把方法应该应用于哪种类型的规则留给了开放式的。丹尼尔的 close()

        3
  •  2
  •   Landei    15 年前

    我认为结构类型是这些特性中的一个,您不需要经常使用,但是 什么时候

    [编辑]

    当然,隐式通常是一种方法,但也有一些情况是你做不到的:假设你有一个可以用方法修改的可变对象,但是它隐藏了状态的重要部分,一种“黑盒”。那你就得设法处理这个东西。

    结构类型的另一个用例是当代码依赖于没有公共接口的命名约定时,例如在机器生成的代码中。在JDK中,我们也可以找到类似的东西,比如StringBuffer/StringBuilder对(其中公共接口Appendable和CharSequence是 方式 对将军)。

        4
  •  1
  •   fernacolo    14 年前

    结构类型为静态链接语言提供了一些动态语言的好处,特别是松耦合。如果你想要一个方法 foo() Bar ,您不需要两个都通用的接口或基类 和 酒吧 . 可以定义结构类型 福() 接受和谁的 没有存在的线索。只要 酒吧 包含与结构类型签名匹配的方法, 可以打电话来。

    很好,因为你可以 和 酒吧 在完全不相关的不同库上,也就是说,没有公共引用协定。这减少了连杆要求,从而进一步有助于松耦合。

    Adapter 模式,因为它提供以下优点:

    • 您不需要实例化适配器-只需传递 酒吧 福()
    • 您不需要实现包装器方法-只需在结构类型中声明所需的签名。
    • 酒吧 所以它可以调用它的方法。这样,单个结构类型可以用于许多实际类型,而对于适配器,则需要编写多个类—每个实际类型一个。

    与适配器相比,结构类型的唯一缺点是结构类型不能用于转换方法签名。因此,当签名不匹配时,必须使用具有某些转换逻辑的适配器。我特别不喜欢对“智能”适配器进行编码,因为在很多时候,它们不仅仅是适配器,并导致复杂性的增加。如果类客户机需要一些额外的方法,我更喜欢简单地添加这样的方法,因为它通常不会影响内存占用。

    推荐文章