【问题标题】:Why self instead of this in self reference? [duplicate]为什么在自我参考中使用 self 而不是 this? [复制]
【发布时间】:2016-10-09 20:11:33
【问题描述】:

我明白 self 类型的结果是什么

trait SpellChecker {
  self: RandomAccessSeq[char] =>
  ...
}

来自http://www.markthomas.info/blog/92

但我不明白为什么在这里使用self 而不是this 更好......!?此外,如果我写 asfd 而不是 self 我也不会收到编译器错误......所以我不太确定“self”是什么意思。我看不出以后可以在 trait 的方法之一中像对象一样使用self

【问题讨论】:

    标签: scala traits self-reference


    【解决方案1】:

    self 是您的 SpellChecker 实例的别名。如果您有嵌套结构(如类),这将很有用。考虑一下:

    trait Foo {
      self =>
    
      override def toString : String = "Foo here"
    
      class Bar {
        def print() : Unit = {
          println(s"this = $this")
          println(s"self = $self")
        }
        override def toString : String = "Bar here"
      }
    }
    
    val foo = new Foo {}
    val bar = new foo.Bar()
    bar.print()
    

    输出:

    this = Bar here 
    self = Foo here
    

    所以如果你想引用外部元素,你可以使用你的别名。使用this 意味着没有别名,所以this : Example => 意味着“我不需要别名,我只是想确保它与Example 混合在一起”。你可以随意命名你的别名,asfdiLikeFries 一样好。 self 只是有点约定俗成。

    【讨论】:

    • 所以,我实际上混合了两件事:“self”的自我引用别名和继承处方?在您的示例中,您没有给出任何继承处方,是吗?你只是化名为this,对吧?
    • 正确。这不是你混合的东西,但这是你可以用自类型注释做的两件事:1)为this创建一个别名和2)确保特征只与一些必需的类型结合使用(s )。你可以做一个,另一个或两者兼而有之。您的问题主要是关于别名部分的表述。
    【解决方案2】:

    在这种特殊情况下,重命名this 是没有意义的。在嵌套的情况下更有意义,当您重命名外部 this 并在嵌套模板/对象中访问它时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2021-04-08
      • 2013-04-04
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多