2009-11-15 16 views
6

द्वारा उपयोग की जाने वाली मुख्य विधि को परिभाषित करने के लिए Scala (जैसा कि नीचे दिखाया गया है) में मुख्य रूप से परिभाषित करने का सामान्य तरीका 'स्कैला' के साथ कक्षाएं चलाने के लिए उपयोग किया जा सकता है, लेकिन 'जावा' नहीं (बनाई गई विधि के बाद से) स्थिर नहीं है)। मैं एक स्कैला वर्ग/वस्तु कैसे लिखूं जिसे 'जावा' के साथ निष्पादित किया जा सकता है?स्कैला: 'जावा'

object HelloWorld { 
    def main(args: Array[String]) { 
    println("Hello, world!") 
    } 
} 
+1

प्रश्न यह गलत है कि आप यह सामान जावा के साथ नहीं चला सकते हैं, क्योंकि बनाई गई विधि स्थिर नहीं है। आप कर सकते हैं, और बनाई गई विधि स्थैतिक है। –

उत्तर

7

आप गलत हैं। आप इसे "जावा" के साथ चला सकते हैं, और संभव नहीं होने के कारण आपने जो कारण दिया है वह सत्य नहीं है। यहां, मुझे दिखाएं कि "स्कैला" के अंदर क्या है।

यूनिक्स:

#!/bin/sh 
... 
exec "${JAVACMD:=java}" $JAVA_OPTS -cp "$TOOL_CLASSPATH" -Dscala.home="$SCALA_HOME" -Denv.classpath="$CLASSPATH" -Denv.emacs="$EMACS" scala.tools.nsc.MainGenericRunner "[email protected]" 

विंडोज:

@echo off 
... 
if "%_JAVACMD%"=="" set _JAVACMD=java 
... 
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner %_ARGS% 

हालांकि , यदि आप एक ही नाम परिभाषित के साथ एक वर्ग के लिए होती हैं, फिर वहाँ एक बग है कि आप को प्रभावित करने वाले है निर्भर करता है आप जिस स्कैला संस्करण का उपयोग कर रहे हैं उस पर।

+0

करने में सक्षम होना चाहता हूं, ठीक है, यह वास्तव में एक खिलौना उदाहरण के लिए काम करता है, मेरे कोड में मेरे पास एक वर्ग के अंदर एक वस्तु है और परिणामी। क्लास में स्थिर नहीं है मुख्य विधि – IttayD

+0

यदि आपके पास कक्षा के अंदर कोई वस्तु है ('क्लास फू {ऑब्जेक्ट बार {डीफ़ मुख्य (तर्क: ऐरे [स्ट्रिंग])}}}) तो मुझे संदेह है कि यह अन्य कारणों से काम करेगा। –

+1

यह बग डैनियल http: //www.eishay को इंगित कर रहा था।कॉम/2009/05/scalas-मुख्य-issue.html – Ashwin

3

सबसे आसान तरीका है, और एक मैं हमेशा प्रयोग करते हैं, वस्तु को परिभाषित करने के लिए है (तुमने किया था के रूप में), लेकिन नहीं एक प्रासंगिक "साथी" वर्ग। उस स्थिति में, स्कैला कंपाइलर कक्षाओं की एक जोड़ी बनाएगा, जिसका नाम ऑब्जेक्ट के समान ही है, जिसमें स्थलीय अग्रेषण विधियां होंगी, लॉन्चर एंट्री पॉइंट्स के प्रयोजनों के लिए, आपको वही चाहिए जो आपको चाहिए। दूसरी कक्षा में आपके ऑब्जेक्ट का नाम $ $ के साथ है और वह जगह है जहां कोड रहता है। यदि आप विवरण के बारे में उत्सुक हैं तो जावप इन चीजों का खुलासा करेंगे। के रूप में आप चाहते हैं

इस प्रकार अपने HelloWorld उदाहरण काम करेंगे, यह अनुमति देता है:

% scala pkg.package.more.HelloWorld args that you will ignore

रान्डेल शुल्ज

+0

मैं 'java pkg.package.more.HelloWorld' – IttayD

7

javap जाएगा तथ्य यह है इस शो में आपको लगता है कि आपका मुख्य स्थिर है।

javap HelloWorld 
Compiled from "HelloWorld.scala" 
public final class HelloWorld extends java.lang.Object{ 
    public static final void main(java.lang.String[]); 
    public static final int $tag() throws java.rmi.RemoteException; 
} 

शायद आपको अपने क्लासपाथ पर स्कैला जार की आवश्यकता है?

स्टैक ओवरफ़्लो पर एक समान प्रश्न है: "Creating a jar file from a Scala file"।

मैंने अभी इस निर्देश को ऊपर दिए गए निर्देशों (लिंक) के साथ सत्यापित किया है।

बस चलाने के माध्यम से:

java -jar HelloWorld.jar 
0

क्या आपको class HelloWorld को परिभाषित करने के लिए भी किया गया था? Scala 2.7.x में एक बग है जो HelloWorld वर्ग पर स्थिर तरीकों को उत्पन्न होने से रोकता है जब object HelloWorld और class HelloWorld दोनों परिभाषित किए जाते हैं।