2012-04-12 11 views
21

Conozco la diferencia de uso entre el parámetro vacío y los métodos sin parámetros en scala, y mi pregunta se refiere al archivo de clase generado. Cuando miro estas dos clases en javap, se ven exactamente lo mismo:¿Cómo sabe Scala la diferencia entre "def foo" y "def foo()"?

class Foo { 
    def bar() = 123; 
} 


class Foo { 
    def bar = 123; 
} 

Pero cuando miro en scalap, reflejan con precisión las listas de parámetros. ¿Dónde en el archivo de clase está Scalac haciendo esta distinción conocida?

Respuesta

20

En el archivo .class, hay un atributo de archivo de clase llamado ScalaSig, que contiene toda la información adicional que necesita Scala. En realidad no es legible por humanos, pero está ahí:

$ 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^.... 

Véase también How is the Scala signature stored? y scala.reflect.ScalaSignature, que no es muy interesante :-)

+0

Gracias! Por alguna razón, -verbose nunca saltó hacia mí desde la página de manual de javap, y como dijiste, no es la cosa más humanamente legible del mundo :) –

Cuestiones relacionadas