scala习题(11)——操作符

本文探讨了Scala中操作符的优先级规则,并通过实例解释了如何根据优先级进行计算。文章提到了BigInt类的pow方法,Fraction类的实现,Money类的设计,以及如何创建ASCIIArt、BigSequence和Matrix类。此外,还讨论了RichFile类的unapply和unapplySeq方法,用于提取文件路径信息。
摘要由CSDN通过智能技术生成

scala操作符优先级
*/%
+-
:
<>
!=
&
^
|-
非操作符
最低优先级赋值操作符
从高到低优先级逐渐降低,同一层属同等优先级,按照从左到右的顺序进行计算(除了以冒号结尾的操作符和赋值操作符)

1.根据优先级规则,3+4 ->5 和 3 ->4+5是如何被求值的
(3+4 ->5)因为+号和->号的优先级在同一层次上(组合操作符按照组合中的最高级别操作符来定义优先级,+,-号在同一层,所以优先级一样),所以按照从左到右的运算方式来运算即为(7,5)
第二个算式存在问题,不能直接这么加减,因为元组和int相加时会先转换成字符串,而5的类型并不是字符串,直接repl中输入就会上报一个type missmatch的错误

2.BigInt类有一个pow方法,但没有用操作符字符。Scala类库的设计者为什么没有选用**(像Fortran那样)或者^(像Pascal那样)作为乘方操作符呢?

一般乘方的操作符是优于乘法操作的,如果使用**作为乘方的话,那么其优先级则与*相同,而如果使用^的话则属于非操作符,则优先级低于*操作。优先级都是有问题的。故没有使用这两种操作符

3.实现Fraction类,支持+*/操作。支持约分,例如将15/-6变为-5/2。除以最大公约数,像这样:

class Fraction(n:Int,d:Int){
    private val num:Int = if(d==0) 1 else n * sign(d)/gcd(n,d);
    private val den:Int = if(d==0) 0 else d * sign(d)/gcd(n,d);
    override def toString = num + "/" + den
    def sign(a:Int) = if(a > 0) 1 else if (a < 0) -1 else 0
    def gcd(a:Int,b:Int):Int = if(b==0) abs(a) else gcd(b,a%b)
    ...
}
class Fraction(n:Int,d:Int){
   
      private val num:Int = if(d==0) 1 else n * sign(d)/gcd(n,d);
      private val den:Int = if(d==0) 0 else d * sign(d)/gcd(n,d);
      override def toString = num + "/" + den
      def sign(a:Int) = if(a > 0) 1 else if (a < 0) -1 else 0
      def gcd(a:Int,b:Int):Int = if(b==0) abs(a) else gcd(b,a%b)
      def +(other:Fraction):Fraction={

         new Fraction((this.num*other.den+this.den*other.num),this.den*other.den);

      }
      def -(other:Fraction):Fraction={
        new Fraction((this.num*other.den-this.den*other.num),this.den*other.den);
      }
      def *(other:Fraction):Fraction={
        new Fraction((this.num*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值