Dường như tạo sự khác biệt cho dù bạn tham khảo this.type
từ bên trong một Đặc điểm hoặc từ phạm vi nơi đối tượng được tạo, với kết quả đáng ngạc nhiên.Tương đương đáng ngạc nhiên và không tương đương về this.type
import scala.reflect.runtime.universe._
trait Trait {
val ttag = typeOf[this.type]
println(s"Trait constructor: $this")
}
object Instance1 extends Trait
object Instance2 extends Trait
println(typeOf[Instance1.type] =:= typeOf[Instance2.type]) // Should be false
println(Instance1.ttag =:= Instance2.ttag) // Should be false
println(Instance1.ttag =:= typeOf[Instance1.type]) // Should be true
Dưới đây là kết quả:
false // As expected: the singleton types of two objects are different.
Trait constructor: [email protected]
Trait constructor: [email protected]
true // But the this.type tags are equivalent
false // and the this.type tag is not equivalent to the singleton type.
Vì vậy, có hai đối tượng khác nhau, nhưng dường như mỗi ngày càng một thẻ loại tương đương cho this.type
của nó, mà không phải là tương đương với .type
của đối tượng như nhìn từ một phạm vi bao quanh.
Đây có phải là lỗi trình biên dịch hay không, nếu không, bạn có thể giải thích tại sao hành vi này có ý nghĩa không?
(Tôi đang chạy Scala 2.11.2. Tôi đã thử nó với một bí danh self
cho this
, với kết quả tương tự.)
Vì những gì nó đáng giá chạy mã của bạn tôi nhận được một lỗi trình biên dịch nội bộ. Vì vậy, một lỗi trình biên dịch dường như không quá khó. Như một cách khác để thử nghiệm, một cách trực tiếp hơn để có được một ý tưởng tương tự là có một phương thức trả về kiểu của một đối tượng cục bộ. – Owen
@Owen Dựa trên cuộc trò chuyện của chúng tôi bên dưới, tìm kiếm của tôi thông qua spec và tìm kiếm thông qua cơ sở dữ liệu vấn đề, tôi đã tiếp tục và đăng [lỗi Scala đầu tiên] (https://issues.scala-lang.org/browse/SI -9439) Tôi hy vọng nó không phải là một bản sao hoặc thực sự không phải là một lỗi! –
Hiểu biết hiện tại của tôi (xây dựng từ nhận xét của Owen và Jason Zaugg): mỗi loại phụ thuộc vào đường dẫn có một “tiền tố” cho biết nơi tìm đối tượng trong phạm vi của nó. Loại kiểm tra tương đương nhìn vào tiền tố, không phải chính đối tượng (chỉ tồn tại ở thời gian chạy và có thể không bao giờ được tạo). Vì vậy, bên trong 'Trait',' this.type' có tiền tố 'Trait', dẫn đến kiểu' Trait.this.type' — cho tất cả các trường hợp. 'Instance1.type' có một tiền tố nói rằng đối tượng được định nghĩa trong phạm vi cấp cao nhất, với tên' Instance1', kết quả là kiểu 'Instance1.type' — khác với bên trong' Trait'. –