2012-04-12 12 views
21

मुझे स्कैला में खाली-पैरामीटर और पैरामीटर रहित विधियों के बीच उपयोग अंतर के बारे में पता है, और मेरा प्रश्न जेनरेट की गई क्लास फ़ाइल से संबंधित है। जब मैं javap में इन दो वर्गों को देखो, वे ठीक उसी देखो:स्कैला को "def foo" और "def foo()" के बीच का अंतर कैसे पता चलता है?

class Foo { 
    def bar() = 123; 
} 


class Foo { 
    def bar = 123; 
} 

लेकिन जब मैं scalap में उनकी ओर देखो, वे सही ढंग से पैरामीटर सूचियों को दर्शाते हैं। कक्षा फ़ाइल में स्केलैक कहां इस भेद को ज्ञात कर रहा है?

उत्तर

20

.class फ़ाइल में, ScalaSig नामक एक क्लास फ़ाइल विशेषता है, जिसमें स्कैला द्वारा आवश्यक सभी अतिरिक्त जानकारी शामिल है। यह वास्तव में मनुष्य द्वारा पढ़ा नहीं जा सकता है, लेकिन यह नहीं है:

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

भी देखें How is the Scala signature stored? और scala.reflect.ScalaSignature है, जो नहीं है बहुत ही दिलचस्प :-)

+0

धन्यवाद! किसी कारण से, कभी-कभी जवाप मैनपेज से मुझ पर कूद नहीं आया, और जैसा कि आपने कहा, यह दुनिया में सबसे ज्यादा मानव-पठनीय चीज़ नहीं है :) –

संबंधित मुद्दे