2009-10-31 17 views
5

माणिक में आप कुछ इस तरह कर सकते हैं:क्या आप रूबी में सी # में किसी फ़ंक्शन में 'विस्तारित' सरणी पास कर सकते हैं?

myMehtod(myArray[0], myArray[1]) 

ताकि विधि शरीर में, एक ==:

def method(a, b) ... end 
myMethod(*myArray) 

तो अगर myArray 2 आइटम की थी, यह इस बात का बराबर होगा myArray [0] और बी == myArray [1]

क्या आप इसे सी # में कर सकते हैं? (इसलिए मेरे पास तर्क के रूप में सरणी लेने के बजाय स्पष्ट तर्कों के साथ घोषित एक विधि हो सकती है)

संपादित करें: मुझे विधि के बारे में अधिक विशिष्ट होना चाहिए था।

उत्तर

9

आपका विधि एक पैरामीटर सरणी स्वीकार करने के लिए, params के माध्यम से घोषित किया जा सकता:

void F(params int[] foo) { 
    // Do something with foo. 
} 

अब आप या तो एक मनमाने ढंग से पारित कर सकते हैं विधि के लिए int एस की संख्या, याकी सरणी। लेकिन एक निश्चित विधि घोषणा के बाद, रूबी में आप जिस तरह से उड़ सकते हैं उस पर एक सरणी का विस्तार नहीं कर सकते हैं, क्योंकि मानकों को हुड के नीचे अलग-अलग संभाला जाता है (मुझे विश्वास है कि यह रूबी में अलग है), और क्योंकि सी # नहीं है गतिशील के रूप में काफी।

सैद्धांतिक रूप से, आप उसी प्रभाव को प्राप्त करने के लिए विधि को कॉल करने के लिए प्रतिबिंब का उपयोग कर सकते हैं, हालांकि (प्रतिबिंबित विधि कॉल हमेशा पैरामीटर सरणी स्वीकार करते हैं)।

+0

मैं इसे जिस तरह से मैं चाहता हूँ काम करने के लिए परिलक्षित बात का उपयोग कर खत्म हो सकता है भेजने खत्म हो जाएगा, लेकिन यह दिलचस्प है। धन्यवाद! –

6

यदि आप params कीवर्ड के साथ अपने फ़ंक्शन के तर्क घोषित करते हैं, तो आप अलग-अलग मानकों की मनमानी संख्या या में पास कर सकते हैं।

उदाहरण के लिए:

public class Foo 
{ 
    public static void Main() 
    { 
     int[] x = new int[] {1,2,3}; 
     Bar(x); 
     Bar(10,11,12); 
    } 

    public static void Bar(params int[] quux) 
    { 
     foreach(int i in quux) 
     { 
      System.Console.WriteLine(i); 
     } 
    } 
} 

पैदा करता

1 
2 
3 
10 
11 
12 
0

आप ऐसा कर सकता है:

void MyMethod(params MyType[] args) 
{ 
} 


MyMethod(myObject1, myObject2, myObject3); 

MyType[] a = { new MyType(), new MyType() }; 
MyMethod(a); 
1

नहीं, आप सरणी "स्वत: विस्तार" जब एक सी # विधि के लिए एक तर्क के रूप में पारित नहीं हो सकता। इस लिख रहा है विधि का अनुकरण करने का एक तरीका overloads:

MyMethod(int a, int b) { /* ... */ } 

MyMethod(int[] c) 
{ 
    // check array length? 
    MyMethod(c[0], c[1]); 
} 

AnotherMethod() 
{ 
    int[] someArray = new[] {1,2}; 

    MyMethod(someArray); // valid 
    MyMethod(1,2);  // valid 
} 

लेकिन जैसे कुछ अन्य लोगों को पहले से ही उल्लेख किया है, यह आसान (और कुछ हद तक रिवर्स) है params कीवर्ड का उपयोग करने के लिए। मेरे उदाहरण (और आपका) में, आप हमेशा अलग a और b रखते हैं। params के साथ आपके पास हमेशा निपटने के लिए एक सरणी है।

0

मेरे पास PostServer(string path, params object[] objects) विधि है जो मेरे सर्वर पर जेसन पोस्ट करती है। लेकिन इससे पहले कि मैं अपनी ऑब्जेक्ट्स सरणी भेजूं, मैं इसके सामने एक सत्र टोकन प्रीपेड करता हूं।

string access_token = "<access_token>"; 
string url = "http://example.com"; 

void PostJson(string path, params object[] objects) { 
    SendHttp(url + path, HttpMethod.POST, JSON.Stringify(objects)); 
} 

void PostServer(string path, params object[] objects) { 
    object[] moreObjects = new object[objects.Length + 1]; 
    object[0] = access_token; 
    objects.CopyTo(moreObjects, 1); 
    PostJson(path, moreObjects); // moreObjects will be expanded into PostJson objects 
} 

फिर ... PostServer("/greet", "Hello World!", true, 3.1415);

अपने सर्वर के लिए पर json ["<access token>","Hello World!",true,3.1415] भेजेंगे।

वास्तव में अभ्यास में मैंने moreObjects दाएं JSON.Stringify पर रखा लेकिन आपको बिंदु मिल गया।

तो आप सरणी का विस्तार कर सकते हैं, लेकिन आपने केवल पैरा पैरामीटर के रूप में एक सरणी पास की है। कॉफ़ीस्क्रिप्ट में आप PostJson(path, access_token, objects...) कर सकते हैं, क्योंकि इसमें एक स्प्लट ऑपरेटर ... है।

आप सी # में PostJson(path, access_token, objects) की कोशिश की, तो आप json ["<access_token>",["Hello World!",true,3.1415]]

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

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