2011-09-02 34 views
13

Theo this, các phương thức Scala thuộc về một lớp. Tuy nhiên, nếu tôi định nghĩa một phương thức trong REPL hoặc trong một kịch bản mà sau đó tôi thực thi bằng cách sử dụng scala, thì phương thức này thuộc về lớp nào?Scala: Có lớp mặc định không nếu lớp học được xác định?

scala> def hoho(str:String) = {println("hoho " + str)} 
hoho: (str: String)Unit 

scala> hoho("rahul") 
hoho rahul 

Trong ví dụ này, phương thức này thuộc loại nào?

Trả lời

17

REPL kết thúc tất cả các câu lệnh của bạn (thực sự viết lại các câu lệnh của bạn) trong các đối tượng một cách tự động. Bạn có thể nhìn thấy nó trong hành động nếu bạn in mã trung gian bằng cách sử dụng tùy chọn -Xprint:typer:

scala> def hoho(str:String) = {println("hoho " + str)} 
[[syntax trees at end of typer]]// Scala source: <console> 
package $line1 { 
    final object $read extends java.lang.Object with ScalaObject { 
    def this(): object $line1.$read = { 
     $read.super.this(); 
    () 
    }; 
    final object $iw extends java.lang.Object with ScalaObject { 
     def this(): object $line1.$read.$iw = { 
     $iw.super.this(); 
     () 
     }; 
     final object $iw extends java.lang.Object with ScalaObject { 
     def this(): object $line1.$read.$iw.$iw = { 
      $iw.super.this(); 
     () 
     }; 
     def hoho(str: String): Unit = scala.this.Predef.println("hoho ".+(str)) 
     } 
    } 
    } 
} 

Vì vậy, phương pháp của bạn hoho thực sự là $line1.$read.$iw.$iw.hoho. Sau đó, khi bạn sử dụng hoho("foo") sau này, nó sẽ viết lại để thêm gói và các đối tượng bên ngoài.

Ghi chú bổ sung: đối với tập lệnh, -Xprint:typer (-Xprint:parser) cho biết mã được bao bọc bên trong khối mã trong main(args:Array[String]) của đối tượng Main. Bạn có quyền truy cập vào các đối số là args hoặc argv.

+0

Cảm ơn. Điều tương tự cũng xảy ra nếu tôi lưu định nghĩa phương thức trong tập lệnh .scala và thực thi nó bằng scala ? – Rahul

+0

@Rahul, tôi đã thêm thông tin cho tập lệnh, cơ chế khác. – huynhjl

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