2009-06-03 13 views
10

यही वह है जो मैंने अभी तक किया है।आप कई मान कैसे वापस करते हैं और उन्हें परिवर्तनीय चर के लिए असाइन करते हैं?

let Swap (left : int , right : int) = (right, left) 

let mutable x = 5 
let mutable y = 10 

let (newX, newY) = Swap(x, y) //<--this works 

//none of these seem to work 
//x, y <- Swap(x, y) 
//(x, y) <- Swap(x, y) 
//(x, y) <- Swap(x, y) 
//do (x, y) = Swap(x, y) 
//let (x, y) = Swap(x, y) 
//do (x, y) <- Swap(x, y) 
//let (x, y) <- Swap(x, y) 
+0

मैं अजगर सीख रहा हूँ और सोच भी कैसे शांत एफ # यदि हम अनुमति हो सकता है: 'ए, बी <- बी, ए', 'एक्स। [ए], एक्स। [बी] <- एक्स [बी], एक्स [ए] 'तो' स्वैप 'की अब आवश्यकता नहीं है। – colinfang

उत्तर

9

आप नहीं कर सकते; एकल असाइनमेंट के साथ 'एक से अधिक म्यूटेबल वेरिएबल' को अपडेट करने के लिए कोई वाक्यविन्यास नहीं है। बेशक आप

let newX, newY = Swap(x,y) 
x <- newX 
y <- newY 
+0

मैं एक और अधिक अनुकूल उत्तर की उम्मीद कर रहा था, लेकिन कम से कम यह एक सही है। श्वास, एफ # की असंगतताएं मेरी तरफ से दर्द का सामना कर रही हैं। मुझे एहसास है कि मैं सीमाओं के खिलाफ दबाव डाल रहा हूं, लेकिन मुझे जल्द ही उन्हें मारना नहीं चाहिए। –

+4

मुझे यकीन नहीं है कि मैं "सीमा" के रूप में विशेषता रखूंगा कि इस विचार को समझने वाली भाषा संरचनाओं को पसंदीदा संरचनाओं से कम सुविधाजनक वाक्यविन्यास है। सर्वोत्तम प्रथाओं को बनाना मेरे लिए एक स्मार्ट विचार की तरह सबसे सुविधाजनक लगता है। –

+2

@ जोएल। क्या सीमा की परिभाषा नहीं है? अगर मैं पसंदीदा वाक्यविन्यास का उपयोग कर रहा था तो मैं उस शब्द का उपयोग नहीं करता। –

2

कोड आप टिप्पणी की है, क्योंकि जब आप लिखना "एक्स, वाई" आप एक नया टपल अपरिवर्तनीय मूल्य है कि बनाने के काम नहीं करता है सकते हैं, इसलिए अद्यतन नहीं किया जा सकता है। आप एक परिवर्तनशील टपल बनाने और उसके बाद स्वैप समारोह का परिणाम से अधिलेखित अगर तुम चाहते हो सकता है:

let mutable toto = 5, 10 

let swap (x, y) = y, x 

toto <- swap toto 

मेरी सलाह एफ # के अपरिवर्तनीय पक्ष की जांच के लिए, तरीकों से आप के लिए अपरिवर्तनीय संरचनाओं का उपयोग कर सकते देखो होगा उत्परिवर्तनीय मूल्यों का उपयोग करके आपने जो किया होगा उसे प्राप्त करें।

रोब

+0

यह संभवतः –

+0

चाहता है यदि आप इसे सामान्य बनाना चाहते हैं, तो आपको अभी भी म्यूटेबल ट्यूपल को मूल मानों पर वापस अनपैक करना होगा। तो वास्तव में एक परिवर्तनीय ट्यूपल का उपयोग एक अपशिष्ट है। –

+1

यह स्पष्ट नहीं है कि आपको मूल चर में नए एक्स और वाई को अनपैक करने या बदलने की आवश्यकता क्यों है। मैं किसी भी असली दुनिया को exmaple आप बस "चलो एक्स ', वाई' = स्वैप एक्स वाई" लिखना होगा और सीधे एक्स और वाई प्राइम का उपयोग करें। – Robert

0

रॉबर्ट के जवाब पर विस्तार करने के लिए:

let swap (x : int, y : int) = y, x 
let mutable x = 5 
let mutable y = 10 
let mutable xy = x, y 

xy <- swap xy 

दोनों चर और टपल परिवर्तनशील बनाता है।

+0

काम नहीं करता है। जब आप एक्स और वाई प्रिंट करते हैं, तो आप देखेंगे कि वे नहीं बदले हैं। एक्सई म्यूटेबल बनाना सिर्फ एक लाल-हेरिंग था, क्योंकि आप मूल चर में आसानी से पारित हो सकते थे। –

+0

सही, एक्स, और वाई अपडेट नहीं होते हैं। –

2

एफ # है "संदर्भ द्वारा" जैसे सी # मानकों है, तो आप एक क्लासिक स्वैप जैसे काम करते लिख सकते हैं:

let swap (x: byref<'a>) (y: byref<'a>) = 
    let temp = x 
    x <- y 
    y <- temp 

let mutable x,y = 1,2 
swap &x &y 
संबंधित मुद्दे