scala之如何在对象上调用 '!=' 方法

haluo1 阅读:21 2024-11-24 20:56:43 评论:0

我刚开始玩 scala,一直在使用 Michel Schinz (http://www.scala-lang.org/node/198) 的“Scala 实例”作为起点。在 traits 部分,我尝试使用反射/方法调用来测试 traits 并想测试所有的比较运算符。我遇到了名称修改的问题,并在 NameTransformer 中为运算符(operator)找到了解决方案。但是,在我看来,!= 运算符并没有转换为等效函数,如 <、<=、>、>=、等于。我想知道是否有一种方法可以像我尚未发现的其他运算符一样调用 !=?

来自pdf:

trait ord { 
def < (that:Any):Boolean 
def <= (that:Any):Boolean = (this < that) || (this == that) 
def > (that:Any):Boolean = !(this <= that) 
def >= (that:Any):Boolean = !(this < that) 
} 
 
class Date(y:Int, m:Int, d:Int) extends ord{ 
def year = y 
def month = m 
def day = d 
 
override def toString():String = year + "-" + month + "-" + day 
 
override def equals(that:Any): Boolean = 
  that.isInstanceOf[Date] && { 
    val o = that.asInstanceOf[Date] 
    o.day == this.day && o.month == this.month && o.year == this.year 
  } 
 
override def <(that:Any):Boolean = { 
  if (!that.isInstanceOf[Date]) 
    error("Cannot compare " + that + " and date") 
  val o = that.asInstanceOf[Date] 
  (year < o.year) || 
  (year == o.year && (month < o.month || 
    (month == o.month && day < o.day ))) 
} 
} 

我的代码:

def Classes_Traits(){ 
val (d1, d2, d3)  = (new Date(2001, 10, 1), new Date(2001, 10, 1), new Date(2000, 1, 10)) 
println("d1 : " + d1) 
println("d2 : " + d2) 
println("d3 : " + d3) 
 
 
Array((d1,d2), (d2,d3), (d3,d1)).foreach { 
  (comp:(Date, Date)) => 
  println("comparing " + comp._1 + " and " + comp._2) 
  val d = comp._1.getClass() 
  Map( 
       "equals            " -> "equals", 
       "not equals        " -> "!=", 
       "less than         " -> "<", 
       "less than or equal" -> "<=", 
       "more than         " -> ">", 
       "more than or equal" -> ">=").foreach { 
     (a) => 
       println(a._1 + " : " +  
       d.getMethod(scala.reflect.NameTransformer.encode(a._2),  
                   classOf[Object]).invoke(comp._1, comp._2)) 
       } 
   /*println("equals : " + m.invoke(comp._1, comp._2) ) 
   // Same as above 
   println(comp._1 + " == " + comp._2 + " is " + (comp._1 == comp._2)) 
   println(comp._1 + " != " + comp._2 + " is " + (comp._1 != comp._2)) 
   println(comp._1 + " > " + comp._2 + " is " + (comp._1 > comp._2)) 
   println(comp._1 + " >= " + comp._2 + " is " + (comp._1 >= comp._2)) 
   println(comp._1 + " < " + comp._2 + " is " + (comp._1 < comp._2)) 
   println(comp._1 + " <= " + comp._2 + " is " + (comp._1 <= comp._2)) 
   */ 
  } 
} 

异常: 比较 2001-10-1 和 2001-10-1 大于或等于 : true 超过:假

Exception in thread "main" java.lang.NoSuchMethodException:    proj2.Main$Date.$bang$eq(java.lang.Object) 
    at java.lang.Class.getMethod(Class.java:1605) 
    at proj2.Main$$anonfun$Classes_Traits$1$$anonfun$apply$1.apply(Main.scala:180) 
    at proj2.Main$$anonfun$Classes_Traits$1$$anonfun$apply$1.apply(Main.scala:178) 
    at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:125) 
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:344) 
    at proj2.Main$$anonfun$Classes_Traits$1.apply(Main.scala:177) 
    at proj2.Main$$anonfun$Classes_Traits$1.apply(Main.scala:168) 
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34) 
    at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:35) 
    at proj2.Main$.Classes_Traits(Main.scala:167) 
    at proj2.Main$.main(Main.scala:26) 
    at proj2.Main.main(Main.scala) 

请您参考如下方法:

尝试调用 equals 并取反结果。 ==!= 得益于 Scala 中的一点编译器魔法(例如,您可以调用 null.==(4) 而无需获取NullPointerException).


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号