// Script A.scala
class A {
    private val privateVal = 1
}
object A extends App{ 
    println(new A().privateVal)
}

A.scala को बिना किसी समस्या के संकलित और चलाया जा सकता है क्योंकि एक साथी वस्तु और उसकी कक्षा एक दूसरे के निजी सदस्यों तक पहुँच सकती है।

$ scalac A.scala
$ scala A
1

एक ही कोड क्यों दिखाएगा कि साथी वस्तु व्याख्या करते समय अपने साथी वर्ग में निजी वैल तक नहीं पहुंच सकती है?

$ scala A.scala
error: value privateVal in class A cannot be accessed in A
1
Julia Chang 24 अक्टूबर 2019, 11:50
6
यह सिर्फ गलत है। "आम तौर पर, एक वर्ग का एक साथी मॉड्यूल एक वस्तु है जिसका नाम वर्ग के समान होता है और इसे समान दायरे और संकलन इकाई में परिभाषित किया जाता है।" यह सब कुछ आवश्यक है, कुछ भी विस्तारित करने में कोई समस्या नहीं है। scala-lang. org/files/archive/spec/2.13/…
 – 
Alexey Romanov
24 अक्टूबर 2019, 13:10
मैंने ऐसी आवश्यकता कभी नहीं देखी। क्या आपके पास कोई संदर्भ है जहां यह आपके द्वारा उल्लिखित गारंटी और सीमाओं के बारे में बात करता है?
 – 
yǝsʞǝla
24 अक्टूबर 2019, 13:15
मैंने "फैंसी" साथी वस्तुओं के साथ बहुत सी समान अप्रत्याशितताएं (पैटर्न-मिलान के साथ बहुत आम) देखी हैं, जो तब तक गायब हो जाती हैं जब तक साथी वस्तु केवल एक वस्तु होने के लिए वापस आती है। और हाँ, यह कहीं भी उल्लेख नहीं किया गया है कि एक साथी वस्तु को सरल होने की आवश्यकता है, लेकिन न ही आपको दस्तावेज़ीकरण में कहीं भी "फैंसी" साथी वस्तुएं मिलेंगी।
 – 
sarveshseri
24 अक्टूबर 2019, 13:49
2
इसे वास्तव में "फैंसी" की परिभाषा की आवश्यकता है। निश्चित रूप से मैं संग्रह प्रकारों की साथी वस्तुओं को केवल App को विस्तारित करने की तुलना में कट्टर मानता हूं।
 – 
Alexey Romanov
24 अक्टूबर 2019, 14:17
ज़रुरी नहीं... DelayedInit कट्टर है। वैसे भी, ओपी का मुद्दा हल हो गया है और वास्तव में इससे संबंधित नहीं था।
 – 
sarveshseri
24 अक्टूबर 2019, 22:26

2 जवाब

सबसे बढ़िया उत्तर

स्कैला में साथी वस्तु प्राप्त करने के लिए एक वर्ग और उसके साथी वस्तु को उसी फ़ाइल में परिभाषित किया जाना चाहिए। ऐसा लगता है कि आप यही कर रहे हैं, खासकर जब आप दुभाषिया का उपयोग नहीं कर रहे हैं।

हालांकि, जब आप स्कैला में लाइन दर लाइन की व्याख्या करते हैं, तो यह इसे अतिरिक्त अनाम ऑब्जेक्ट में लपेटता है ताकि आरईपीएल (और अधिक यहां)।

रैपिंग समस्या का एक उदाहरण यहां दिया गया है:

काम नहीं करता:

$ scala
Welcome to Scala version 2.10.6 (OpenJDK 64-Bit Server VM, Java 1.8.0_222).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class A {
     |     private val privateVal = 1
     | }
defined class A

scala> object A extends App{ 
     |     println(new A().privateVal)
     | }
<console>:9: error: value privateVal in class A cannot be accessed in A
           println(new A().privateVal)
                           ^

:paste का उपयोग करके एक ही समय में परिभाषित होने पर काम करता है:

scala> :paste
// Entering paste mode (ctrl-D to finish)

// Script A.scala
class A {
    private val privateVal = 1
}
object A extends App{ 
    println(new A().privateVal)
}

// Exiting paste mode, now interpreting.

defined class A
defined module A

BTW, scala A.scala चलाते समय मुझे यह समस्या नहीं आती। शायद मैं अलग संस्करण या सेटिंग्स का उपयोग कर रहा हूँ।

यदि आप पेस्ट मोड का उपयोग नहीं कर सकते हैं, या दुभाषिया को एक ही बार में पूरी फ़ाइल को पढ़ने के लिए नहीं कह सकते हैं, तो एक कोड ब्लॉक की व्याख्या के लिए बाध्य करने के लिए किसी भी ऑब्जेक्ट में अपने कोड को लपेटना एक समाधान है:

scala> object Workaround {
     | class A {
     |     private val privateVal = 1
     | }
     | object A extends App{ 
     |     println(new A().privateVal)
     | }
     | }
defined module Workaround
6
yǝsʞǝla 24 अक्टूबर 2019, 12:26

:paste कमांड का उपयोग पूरी फाइल को लोड करने के लिए भी किया जा सकता है, उदाहरण के लिए,

$ scala
scala> :paste A.scala

अमोनाइट पर भी विचार करें, जो आउट-ऑफ़-द-बॉक्स काम करता प्रतीत होता है

amm A.scala
3
Mario Galic 24 अक्टूबर 2019, 12:51