Scala編程語言有一個簡潔的特性,稱為pass by name arguments,它允許某些引數僅在需要時才被評估。
例如,可以使用如下柯里化方法撰寫while回圈:
// This is Scala code. A simulated while loop
@scala.annotation.tailrec
def myWhile(condition: => Boolean)(actions: => Unit): Unit = {
if(condition) {
actions
myWhile(condition)(actions)
}
}
這個方法可以像常規while回圈一樣使用,這要歸功于Scala的語法糖、閉包和——這里特別感興趣的——將運算式作為函式引數傳遞的能力,這些函式在參考時進行評估(如: => type引數宣告所示)。
例如,以下列印“Hello!” 到控制臺十次:
var i = 0
myWhile(i < 10) {
println("Hello!")
i = 1
}
對于那些需要了解發生了什么的人來說,運算式i < 10每次condition出現在方法內部的if(...)陳述句中時都會被評估,同樣,println("Hello!"); i = 1每次actions出現在方法體中時都會被評估。當遞回呼叫myWhile下一次迭代時,運算式按原樣傳遞,因為該方法需要運算式,而不是值。Scala術語這些通過名稱引數傳遞。
如果這些引數是按值傳遞的,那么i < 10將傳遞給myWhileas false,而 "Hello!" 將只列印一次,i將增加一次,并且回圈將無限執行。
(Scala主要是一種函式式語言,這段代碼甚至不接近FP,但它是一個簡單的例子。)
我的問題是,有沒有辦法以這種方式將引數傳遞給C#函式?另請注意,我僅限于使用C# 7.3。:-(
uj5u.com熱心網友回復:
聽起來你可以與Func`1and有點接近Action:
void MyWhile(Func<bool> condition, Action action) {
while (condition()) {
action();
}
}
并呼叫:
int i = 0;
MyWhile(() => i < 10, () => {
Console.WriteLine("Hello!");
i;
});
語法有點不同,但想法是相似的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/483187.html
