在Scala中,类的主构造函数没有显式主体,但是从类主体隐式定义.那么,如何区分字段和本地值(即构造函数方法的本地值)?
例如,请使用以下代码片段,这是"Scala中的编程"中的一些示例代码的修改形式:
class R(n: Int, d: Int) {
private val g = myfunc
val x = n / g
val y = d / g
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,这将生成一个包含三个字段的类:私有"g",以及公共"x"和"y".但是,g值仅用于计算x和y字段,并且除了构造函数范围之外没有任何意义.
所以在这个(公认的人为的)例子中,你如何为这个构造函数定义局部值?
我正在阅读"Scala编程"一书,并Rational在第6章的实现中遇到了一些问题.
这是我Rational班级的初始版本(基于本书)
class Rational(numerator: Int, denominator: Int) {
require(denominator != 0)
private val g = gcd(numerator.abs, denominator.abs)
val numer = numerator / g
val denom = denominator / g
override def toString = numer + "/" + denom
private def gcd(a: Int, b: Int): Int =
if(b == 0) a else gcd(b, a % b)
// other methods go here, neither access g
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,字段g在类的生命周期内保持不变,即使从未再次访问过.运行以下模拟程序可以看到此问题:
object Test extends Application {
val a = new Rational(1, 2) …Run Code Online (Sandbox Code Playgroud)