[英]Scala - Can I define a function that receives any function as a parameter?
在Scala中,是否可以定義一個可以接收其他任何函數作為參數的函數?
它應該類似於以下內容:
object Module extends SecureModule{
val bc = new MyBC()
def method(parameter: Type) = {
exec(bc.method(parameter))
}
def method2(parameter1: Type1, parameter2: Type2) = {
exec(bc.method2(parameter1,parameter2))
}
}
trait SecureModule {
def exec(f: ANY_PARAMETER => ANY_RESULT) = {
//some extra processing
f
}
}
可能嗎? 如果是這樣,我怎么能做到這一點?
先感謝您。
scala的好處是您可以創建自己的語法。
如果要包裝一個操作以便可以進行預處理和后期處理,以及控制執行上下文,則可以使用按名稱調用參數來執行此操作。 例如,如果我們只是想計時一個代碼塊要花多長時間,那么我們可以執行以下操作:
def timer[T](block: => T): (T,Long) = {
val startDate = new Date()
val result = block
val endDate = new Date()
(result, endDate.getTime()-startDate.getTime())
}
我們可以這樣使用它:
val (result,duration) = timer {
1+3
}
或者像這樣
val (result,duration) = timer {
"hello" + " world!"
}
結果將具有您傳入的塊中正確的類型,同時還為您提供了所需的持續時間。
我的印象是您的描述有些誤導。 據我了解,您(可能)想做的就是將bc.method
調用的執行延遲到執行了其他一些代碼為止。 如果是這樣,請嘗試以下操作:
object Module extends SecureModule{
val bc = new MyBC()
def method(parameter: Type) = {
exec(() => bc.method(parameter))
}
def method2(parameter1: Type1, parameter2: Type2) = {
exec(() => bc.method2(parameter1,parameter2))
}
}
trait SecureModule {
def exec[Result](f: () => Result): Result = {
//some extra processing
f()
}
}
您不能將任何函數用作參數。 你會怎么做?
充其量,您可以使用具有特定數量參數的任何函數。
例如,在這里, f
接受一個參數並返回一個值。
def exec[A,B](f: A => B)
在這里, f
有兩個參數:
def exec[A,B,C](f: (A, B) => C)
如果您不關心函數的返回類型,則可以始終使用Any
代替類型參數,因為函數的返回類型是協變的:
def exec[A](f: A => Any)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.