2012-04-12 36 views
21

Tôi biết về sự khác biệt về cách sử dụng giữa tham số rỗng và phương thức không tham số trong scala và câu hỏi của tôi liên quan đến tệp lớp được tạo. Khi tôi nhìn vào hai lớp này trong javap, chúng trông giống hệt nhau:Làm thế nào để Scala biết sự khác biệt giữa "def foo" và "def foo()"?

class Foo { 
    def bar() = 123; 
} 


class Foo { 
    def bar = 123; 
} 

Nhưng khi tôi nhìn vào chúng trong scalap, chúng phản ánh chính xác danh sách tham số. Trường hợp trong lớp tập tin là scalac làm cho sự khác biệt này được biết đến?

Trả lời

20

Trong tệp .class, có thuộc tính tệp lớp được gọi là ScalaSig, chứa tất cả thông tin bổ sung cần thiết bởi Scala. Nó không thực sự có thể đọc được bởi con người, nhưng nó là ở đó:

$ javap -verbose Foo.class 
const #195 = Asciz  ScalaSig; 
const #196 = Asciz  Lscala/reflect/ScalaSignature;; 
const #197 = Asciz  bytes; 
const #198 = Asciz  ^F^A!3A!^A^B^A^S\t\tb)^[7f^Y^Vtw\r^^5DQ^V^\7.^Z:^K^E\r!^ 
Q^A^B4jY^VT!!^B^D^B^UM^\^W\r\1tifdWMC^A^H^.... 

Xem thêm How is the Scala signature stored?scala.reflect.ScalaSignature, mà không phải là rất thú vị :-)

+0

Cảm ơn! Vì lý do nào đó, -verbose không bao giờ nhảy ra khỏi tôi từ trang manpage javap, và như bạn đã nói, nó không phải là thứ có thể đọc được nhiều nhất trên thế giới :) –

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