以下代碼來自Martin Odersky等人編寫的Scala書籍。它定義了一個合理的類型:是否有可能在Scala中定義構造函數局部變量?
class Rational(n: Int, d: Int) {
require(d != 0)
private val g = gcd(n.abs, d.abs)
val numer = n/g
val denom = d/g
...
private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}
這裏的值g只在隱式構造函數初始化字段numer和denom時使用。假設程序員知道它不會在其他地方使用。在上述情況下,在構造Rational對象之後仍然可以訪問它。這意味着它將佔用空間,因爲它是一個私有字段,而不是構造函數的局部變量。
我的問題是如何更改此代碼,以便g
僅在施工時使用,然後丟棄?
這是Scala中那些「噁心點」之一。想象一下,如果給定的構造函數對象僅用於提取一些任意的信息:即使只需要一小部分信息,永久使用它也會使其不適合回收。我認爲有一個「課前體」的語法,但我不記得它是什麼。 – 2012-01-12 22:15:40
@pst感謝您的快速編輯,我在此期間正在這麼做。你的看起來好多了。 :) – ciuncan 2012-01-12 22:16:20
如果任何人有任何關於pst提到的「pre-class body」語法的鏈接,我很樂意聽到它。 – 2012-01-13 01:16:30