【问题标题】:Scala with keyword usageScala 的关键字用法
【发布时间】:2021-09-09 23:17:14
【问题描述】:

我找到了简单的例子:

class Post extends LongKeyedMapper[Post] with IdPK {
    def getSingleton = Post

    object title extends MappedText(this)
    object text extends MappedText(this)
    object date extends MappedDate(this)
}


object Post extends Post with LongKeyedMetaMapper[Post] {
    def getPosts(startAt: Int, count: Int) = {
        Post.findAll(OrderBy(Post.date, Descending), StartAt(startAt), MaxRows(count))
    }

    def getPostsCount = Post.count
}

with IdPK 是什么意思?

谢谢。

【问题讨论】:

    标签: scala


    【解决方案1】:

    with 表示该类正在使用通过mixin 的特征。

    Post 具有 Trait IdPK(类似于 Java 类可以 implements 一个接口)。

    另见A Tour of Scala: Mixin Class Composition

    【讨论】:

    • 谢谢,我忘记了 scala 中的特征。
    【解决方案2】:

    虽然这不是对原始问题的直接回答,但它可能对未来的读者有用。来自Wikipedia

    Scala 允许在创建类的新实例时混入 trait(创建匿名类型)。

    这意味着with 可以在类定义的第一行之外使用。示例:

    trait Swim {
      def swim = println("Swimming!")
    }
    
    class Person
    
    val p1 = new Person  // A Person who can't swim
    val p2 = new Person with Swim  // A Person who can swim
    

    p2 这里有方法swim 可用,而p1 没有。 p2real 类型是“匿名”类型,即Person with Swim。事实上,with 语法可以用在任何类型签名中:

    def swimThemAll(ps: Seq[Person with Swim]): Unit = {
      ps.foreach(_.swim)
    }
    

    编辑(2016 年 10 月 12 日): 我们发现了一个怪癖。以下内容无法编译:

     // each `x` has no swim method
     def swim(xs: Seq[_ >: Person with Swim]): Unit = {
       xs.foreach(_.swim)
     }
    

    这意味着就词汇优先级而言,with 急切地绑定。这是_ >: (Person with Swim),不是(_ >: Person) with Swim

    【讨论】:

    • 嘿@fosskers,我正在网上寻找答案,但没有找到答案,在我的搜索中我最终到了这里 - 如果我有Seq[_ >: Person with Swim],这是否意味着“任何Person with Swim 类型的超类型”或“Person 类型的任何超类型,混合有 Swim”?老实说,两者都没有太大意义,我从来没有需要使用它,但我在其他代码中找到了它。
    猜你喜欢
    • 2011-08-19
    • 2012-04-01
    • 2015-09-10
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多