2009-11-08 81 views
1

C#有匿名代理。所以,我可以寫:F#塊參數

public vois foo(string d, Action t){ 
    t(); 
} 

在紅寶石:

def foo d 
    yield 
end 

如何做到在F#一樣的嗎?首選語法是:

foo "dfdfdf" { do something here } 

感謝

+0

我認爲你沒有明確表達你的觀點。你的foo函數在你的c#和ruby實現中是不同的。那麼你的問題是什麼?你不知道如何將委託傳遞給函數並執行它? – 2009-11-08 18:51:50

+0

他們實際上是一樣的。它們是接受兩個論點的函數。首先是字符串d,第二個是可執行代碼。對於C#示例,這是通過Action完成的(因此它接受匿名方法)。對於ruby而言,只是隱式的塊執行(yield會執行一些你會作爲第二個參數傳遞的東西) – 2009-11-08 19:00:32

+0

奇怪的使用「yield」keywork :)。現在我明白了。 – 2009-11-08 19:07:21

回答

6

你的第一個例子是不是一個匿名方法 - 它只是路過,並通過委託調用(這可能是指一個命名或匿名方法) 。在F#做到這一點,只需提供和調用一個函數參數:

let foo n f = f n 

let square n = n * n 
let result = foo 123 square 
printfn "%A" result 

要建立在F#中的匿名方法是等效的,使用的樂趣關鍵字:

let result2 = foo 123 (fun n -> n * n) 
+0

當然不是。它是razer消費者的匿名方法。無論如何,謝謝你的解決方案。 – 2009-11-08 18:53:06

1
open System 

// create a function that expects an Action delegate and executes it 
let foo (actionDelegate:Action) (s:String) = actionDelegate.Invoke(); 

// create a function that meets Action delegate 
let ActionFunction param = Console.Write("Action in action") 

// call foo passing ActionFunction 
foo (new Action(ActionFunction)) "my string" 
+0

好吧,我不看如何使用.NET操作。這就是爲什麼我也參考ruby的例子。 – 2009-11-08 18:54:17