您好,登录后才能下订单哦!
这期内容当中小编将会给大家带来有关Scala中如何使用私有字段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
私有字段和方法
上一个版本的Rational类里,我们只是分别用n初始化了numer,用d初始化了denom。结果,Rational的分子和分母可能比它所需要的要大。例如分数 ,可以更约简化为相同的最简形式, ,但Rational的主构造器当前并不做这个工作:
51CTO编辑推荐:Scala编程语言专题
scala> new Rational(66, 42) res15: Rational = 66/42
要想对分数进行约简化,需要把分子和分母都除以***公约数:greatest common divisor。如:66和42的***公约数是6。(另一种说法就是,6是能够除尽66和42的***的整数。) 的分子和分母都除以6就产生它的最简形式, 。代码6.3展示了如何做到这点:
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 def this(n: Int) = this(n, 1) def add(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) override def toString = numer+"/"+denom private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) }
代码 6.3 带私有字段和方法的Rational
这个版本的Rational里,我们添加了私有字段,g,并修改了numer和denom的初始化器(初始化器:initializer是初始化变量,例如初始化numer的“n / g”,的代码)。因为g是私有的,它只能在类的主体之内,而不能在外部被访问。我们还添加了一个私有方法,gcd,用来计算传入的两个Int的***公约数。比方说,gcd(12, 8)是4。正如你在4.1节中看到的,想让一个字段或方法私有化你只要把private关键字放在定义的前面。私有的“助手方法”gcd的目的是把类的其它部分,这里是主构造器,需要的代码分离出来。为了确保g始终是正的,我们传入n和d的绝对值,调用abs即可获得任意整数的绝对值。
Scala编译器将把Rational的三个字段的初始化代码依照它们在源代码中出现的次序放入主构造器。所以g的初始化代码,gcd(n.abs, d.abs),将在另外两个之前执行,因为它在源文件中出现得最早。g将被初始化为类参数,n和d,的绝对值的***公约数。然后再被用于numer和denom的初始化。通过把n和d整除它们的***公约数,g,每个Rational都将被构造成它的最简形式:
scala> new Rational(66, 42) res24: Rational = 11/7
定义操作符
undefined
x + y
但是如果是分数就必须写成:
x.add(y)
或至少是:
x add y
没有合理的解释为什么就必须是这样的。分数和别的数应该是一样的。数学的角度上看他们甚至比,唔,浮点数,更自然。为什么就不能使用自然的数学操作符呢?Scala里面你做得到。本章后续部分,我们会告诉你怎么做。
***步是用通常的数学的符号替换add方法。这可以直接做到,因为Scala里+是合法的标识符。我们可以用+定义方法名。既然已经到这儿了,你可以同样实现一个*方法以实现乘法,结果展示在代码6.4中:
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 def this(n: Int) = this(n, 1) def +(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) def *(that: Rational): Rational = new Rational(numer * that.numer, denom * that.denom) override def toString = numer+"/"+denom private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) }
代码 6.4 带操作符方法的Rational
有了这种方式定义的Rational类,你现在可以这么写了:
scala> val x = new Rational(1, 2) x: Rational = 1/2 scala> val y = new Rational(2, 3) y: Rational = 2/3 scala> x + y res32: Rational = 7/6
与以往一样,在***输入的那行里的语法格式相等于一个方法调用。你也能这么写:
scala> x.+(y) res33: Rational = 7/6
不过这样写可读性不佳。
另外一件要提的是基于5.8节中提到的Scala的操作符优先级规则,Rational里面的*方法要比+方法绑定得更结实。或者说,Rational涉及到+和*操作的表达式会按照预期的方式那样表现。例如,x + x * y会当作x + (x * y)而不是(x + x) * y:
scala> x + x * y res34: Rational = 5/6 scala> (x + x) * y res35: Rational = 2/3 scala> x + (x * y) res36: Rational = 5/6
上述就是小编为大家分享的Scala中如何使用私有字段了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。