快速业务通道

面向Java开发人员的Scala指南 - 类操作 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
Rational 类中,为有理数定义了 4 种操作。它们是规范的数学操作:加、减、乘、除。每种操作以它的数学符号命名:+、-、 * 和 /。

但是请注意,这些操作符每次操作时都构造一个新的 Rational 对象。同样,这与 java.lang.String 非常相似,这是默认的实现,因为这样可以产生线程安全的代码(如果线程没有修改共享状态 —— 默认情况下,跨线程共享的对象的内部状态也属于共享状态 —— 则不会影响对那个状态的并发访问)。

有什么变化?

一切都是函数,这一规则产生两个重要影响:

首先,您已经看到,函数可以作为对象进行操纵和存储。这使函数具有强大的可重用性,本系列 第一篇文章 对此作了探讨。

第二个影响是,Scala 语言设计者提供的操作符与 Scala 程序员认为应该 提供的操作符之间没有特别的差异。例如,假设提供一个 “求倒数” 操作符,这个操作符会将分子和分母调换,返回一个新的 Rational (即对于 Rational(2,5) 将返回 Rational(5,2))。如果您认为 ~ 符号最适合表示这个概念,那么可以使用此符号作为名称定义一个新方法,该方法将和 Java 代码中任何其他操作符一样,如清单 5 所示:

清单 5. 求倒数

val r6 = ~r1   Console.println(r6) // should print [3 / 1], since r1 = [1 / 3]

在 Scala 中定义这种一元 “操作符” 需要一点技巧,但这只是语法上的问题而已:

清单 6. 如何求倒数

class Rational(n:Int, d:Int) {   // ... as before ...   def unary_~ : Rational =    new Rational(denom, numer) }

当然,需要注意的地方是,必须在名称 ~ 之前加上前缀 “unary_”,告诉 Scala 编译器它属于一元操作符。因此,该语法将颠覆大多数对象语言中常见的传统 reference-then-method 语法。

这条规则与 “一切都是对象” 规则结合起来,可以实现功能强大(但很简单)的代码:

清单 7. 求和

1 + 2 + 3 // same as 1.+(2.+(3))   r1 + r2 + r3 // same as r1.+(r2.+(r3))

当然,对于简单的整数加法,Scala 编译器也会 “得到正确的结果”,它们在语法上是完全一样的。这意味着您可以开发与 Scala 语言 “内置” 的类型完全相同的类型。

Scala 编译器甚至会尝试推断具有某种预定含义的 “操作符” 的其他含义,例如 += 操作符。注意,虽然 Rational 类并没有显式地定义 +=,下面的代码仍然会正常运行:

清单 8. Scala 推断

var r5 = new Rational(3,4)   r5 += r1   Console.println(r5)

打印结果时,r5 的值为 [13 / 12],结果是正确的。

面向Java开发人员的Scala指南 - 类操作(4)

时间:2011-01-30 IBM Ted Neward

Scala 内幕

记住,Scala 将被编译为 Java 字节码,这意味着它在 JVM 上运行。如果您需要证据,那么只需注意编译器生成以 0xCAFEBABE 开头的 .class 文件,就像 javac 一样。另外请注意,如果启动 JDK 自带的 Java 字节码反编译器(javap),并将它指向生成的 Rational 类,将会出现什么情况,如清单 9 所示:

清单 9. 从 rational.scala 编译的类

C:\Projects\scala-classes\code>javap -private -classpath classes Rational
Compiled from "rational.scala"
public class Rational extends java.lang.Object implements scala.ScalaObject{
    private int denom;
    private int numer;
    private int g;
    public Rational(int, int);
    public Rational unary_$tilde();
    public java.lang.String toString();
    public Rational $div(Rational);
    public Rational $times(Rational);
    public Rational $minus(Rational);
    public R

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号