2015-06-01 15 views
5

Nhìn vào câu hỏi này, Fill immutable map with for loop upon creation, tôi đã tò mò về những gì this có nghĩa là trong Map(1 -> this).`this` Gõ vào Scala

scala> Map(1 -> this) 
res6: scala.collection.immutable.Map[Int,type] = Map(1 -> @53e28097) 

scala> res6(1) 
res7: type = @53e28097 

Tôi chưa thấy type trước đây làm loại.

nó là gì?

+0

+1, bởi vì mặc dù ban đầu tôi nghĩ rằng điều này sẽ đơn giản "nó chỉ là một tham chiếu đến phạm vi hiện tại", tôi đã hoàn toàn có thể tìm ra nó là gì cho bản thân mình. Điều này không được giúp đỡ bởi sự khó khăn của google "cái này" ở Scala. – KChaloux

Trả lời

2

Dường như nó hoạt động một chút lẻ trong REPL, nhưng nếu bạn thực sự biên dịch hoặc giải thích tập lệnh, thì this thực sự dường như trỏ đến cá thể hiện tại của đối tượng bao quanh.

import scala.reflect.runtime.{ universe => ru } 

object Main { 
    def getType[T : ru.TypeTag](instance: T) = ru.typeOf[T] 

    def sayHello = println("hello!") 

    def main(args: Array[String]): Unit = { 
    println(this.getType(123)) // Prints "Int" 
    this.sayHello    // Prints "hello!" to the console 

    getType(this).decls foreach println _ 
    // Prints the following outputs to the console: 
    // constructor Main 
    // method getType 
    // method sayHello 
    // method main 
    } 
} 

Vì lý do tại sao nó không thể hiện hành vi này trong REPL, tôi không chắc chắn.

+1

"Vì lý do tại sao nó không thể hiện hành vi này trong REPL, tôi không chắc chắn". Nó có. Hãy thử dán mã của bạn trong REPL và sau đó thực hiện 'Main.main (Array.empty)', bạn sẽ nhận được kết quả tương tự (nói cách khác, 'thid' sẽ tham chiếu đến' Main' trong REPL). Tuy nhiên, nếu bạn tham chiếu 'this' trong khai báo mức cao nhất trong REPL,' this' sẽ thực sự tham chiếu đến lớp/đối tượng kèm theo, trong trường hợp này xảy ra là một đối tượng bao bọc được tạo bởi REPL để lưu trữ khai báo của bạn (xem http://stackoverflow.com/questions/11549174/trying-to-understand-how-classes-declared-on-the-repl-are-treated-internally) –

+1

Đối với nơi 'loại' đang đến, tôi (thuần khiết đầu cơ) đoán là nó đến từ REPL đang cố gắng dọn dẹp loại thực tế. Bởi vì mã nằm trong một đối tượng bao bọc có tên là '$ iw', khi bạn khai báo một lớp/đặc điểm' Foo' trong repl, kiểu thực tế sẽ giống như 'iw.Foo', nhưng bạn thực sự không muốn biết về '$ iw' để REPL loại bỏ tiền tố' $ iw' và chỉ in 'Foo'. Trong trường hợp của OP, 'this' có kiểu' $ iw.type', do đó, loại bỏ '$ iw' chỉ để lại' type', mà tiếc là không phải là một loại thực tế. Vì vậy, đó sẽ chỉ là một trường hợp góc của REPL cố gắng để được tốt đẹp với bạn. –

Các vấn đề liên quan