2012-06-21 29 views
6

एफ # में, आप एक फ़ंक्शन को कैसे घुमाते हैं जो चरम संख्याओं को स्वीकार करता है?एफ # में, आप परमएरे फ़ंक्शन (जैसे sprintf) को कैसे करी करते हैं?

मैं इस तरह कोड है ... (लॉग समारोह सिर्फ एक उदाहरण है, सटीक कार्यान्वयन कोई फर्क नहीं पड़ता)

let log (msg : string) = 
    printfn "%s" msg 

log "Sample" 

यह sprintf स्वरूपित तार के साथ कोड भर बुलाया जाता है, उदा।

log (sprintf "Test %s took %d seconds" "foo" 2.345) 

मैं तो यह की तरह लग रहा लॉग समारोह में sprintf कार्यक्षमता करी करना चाहते हैं ...

logger "Test %s took %d seconds" "foo" 2.345 

मैं की तरह

let logger fmt ([<ParamArray>] args) = 
    log (sprintf fmt args) 

कुछ कोशिश की है, लेकिन मैं समझ नहीं sprintf कॉल के माध्यम से ParamArray तर्क कैसे पारित करें।

यह एफ # में कैसे किया जाता है?

+2

FYI - आप [स्वरूपण अभिव्यक्ति] के बारे में पूछ रहे हैं (http://msdn.microsoft.com/en-us/library/ee340241) (जो टाइप किए गए हैं), परम सरणी नहीं (जो अनियमित हैं)। – Daniel

उत्तर

7
let log (s : string) =() 
let logger fmt = Printf.kprintf log fmt 

logger "%d %s" 10 "123" 
logger "%d %s %b" 10 "123" true 
+0

धन्यवाद यह वही है जो मैं खोज रहा था – Fendy

5

printf का व्यवहार एफ # में समान कार्यों में कुछ खास है। वे एक प्रारूप स्ट्रिंग लेते हैं, जो निर्दिष्ट तर्कों को निर्दिष्ट करता है। आप Printf.kprintf का उपयोग कर सकते हैं जैसा कि डेस्को द्वारा दिखाया गया है कि आप अपने स्वयं के फ़ंक्शन को परिभाषित करें जो एक प्रारूप स्ट्रिंग लेता है, लेकिन आप प्रारूप स्ट्रिंग के हैंडलिंग को नहीं बदल सकते हैं।

आप सी # params (जहां तर्क की संख्या चर रहा है, लेकिन प्रारूप स्ट्रिंग पर निर्भर नहीं करता) की तरह कुछ करना चाहते हैं, तो आप ParamArray विशेषता सीधे एक सदस्य पर उपयोग कर सकते हैं:

open System 

type Foo = 
    static member Bar([<ParamArray>] arr:obj[]) = 
    arr |> Seq.mapi (fun i v -> printfn "[%d]: %A" i v) 

तो फिर तुम प्रारूप स्ट्रिंग के बिना तर्क के किसी भी संख्या के साथ Foo.Bar कॉल कर सकते हैं:

Foo.Bar("hello", 1, 3.14) 

इस स्ट्रिंग प्रारूपण के लिए कम सुरुचिपूर्ण है, लेकिन यह अन्य स्थितियों में उपयोगी हो सकता है। दुर्भाग्यवश, यह केवल सदस्यों के साथ काम करेगा (और let के साथ परिभाषित कार्यों के साथ नहीं)