一個val
沒有按沒有參數,因爲它被計算並存儲在一個字段中。但我可能只是將您在郵件列表上最近兩天的廣泛帖子轉給您。
或者,讓我們從Java的角度來考慮它,因爲Scala在jvm級別與Java兼容,並且它肯定必須遵守jvm規則。讓我們先從第一類:
abstract class X {
def expensiveOperation(p: Int => Boolean) : List[Int]
}
現在,讓我們來擴展它:
abstract class Y extends X {
override val expensiveOperation: ((Int) => Boolean) => List[Int]
}
因此,從Java中,我們知道,類X
有方法expensiveOperation
,接收Function1[Int, Boolean]
並返回List[Int]
。
現在我們去上課Y
。當然,它必須定義相同的方法,但它也必須定義吸氣器expensiveOperation
,它不接收參數並返回Function1[Function1[Int, Boolean],List[Int]]
。
只要這種附加方法也不存在於X
之內,則可能是可行的。所以讓我們定義它:
class Z extends Y {
override val extensiveOperation = new Function1[Function1[Int, Boolean], List[Int]] {
def apply(p: Int => Boolean) = List range (1, 10) filter p
}
}
這是如何定義的?斯卡拉是否將apply
的身體作爲expensiveOperation
(接收參數而不是吸氣者)的身體複製?它可能仍然可行。讓我們嘗試別的東西,但:
class W(f: ((Int) => Boolean) => List[Int]) extends Y {
override val extensiveOperation = f
}
現在,我們如何重寫extensiveOperation
接收參數?我想我們可以這樣寫:
override def extensiveOperation(p: Int => Boolean) = extensiveOperation.apply(p)
這是可行的。但我個人認爲這有點複雜。我的建議是:寫一個簡短的SID,並在Scala郵件列表上獲得一些協議。但是,如果沒有代碼來實現它,我認爲它不太可能被採用 - Scala必須跟蹤每個函數val
來判斷它是否重寫def
。
我很困惑。你的val看起來像一個'Function0',而不是'Function1'。它應該採取什麼參數?此外,val中沒有短路,所以你爲什麼要這麼做?如果發生短路,爲什麼不使用'Stream'而不是'List'? – 2010-01-28 15:02:50
我不明白這個問題。你能更清楚地解釋你想做什麼,而不是你如何去做。目前你只告訴我們「如何」部分。 – 2010-01-28 15:03:46
我的'val'是一個函數1,因爲它本質上是一個指向'List.filter'方法的指針(它將'Function1'作爲參數。我的問題是,我可以有一個'val'實現一個'def',其中'def'不需要任何參數,但是我不明白爲什麼不能用args擴展到'def's? – 2010-01-28 15:45:33