Scala : 2 days ago

2 days ago 能夠是一行代碼,如同java裏(int i=0;)能夠經過編譯,太Cool了,如同一句平常用語,很是吸引人;這行代碼是在《Programming Scala:multi...》7.5節"隱式類型轉換"裏看到的,書裏ago好像用的是String類型的,缺少美觀,雖是本入門級的書,不過入門級卻 不必定是寫的很薄,能夠作一些全面的介紹而不求講的很深刻;

因而本身就改編了一下: java

import java.text.SimpleDateFormat  
    import java.util.{Calendar,Date}  
      
    sealed abstract class Day  
    abstract class Forward extends Day  
    abstract class Backward extends Day  
    case object ago extends Backward  
    case object before extends Backward  
    case object after extends Forward  
    case object later extends Forward  
      
    class DSL(x:Int){  
           def days(day:Day)={  
                  var can=Calendar.getInstance  
                  def backward():Unit=can.set(Calendar.DAY_OF_MONTH, can.get(Calendar.DAY_OF_MONTH)-x)  
                  def forward():Unit=can.set(Calendar.DAY_OF_MONTH, can.get(Calendar.DAY_OF_MONTH)+x)  
                  day match{  
                         case day:Backward => backward()  
                         case day:Forward => forward()  
                         case _ =>  
                  }  
                  DSL.formats(can.getTime)  
           }  
    }  
      
    object DSL{  
           implicit def intToDSL(x:Int)=DSL(x)  
           def apply(x:Int)=new DSL(x)  
           def formats(date:Date)=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date)  
           def now=formats(Calendar.getInstance.getTime)+" => now..."  
             
           def main(args:Array[String]):Unit={  
                 println(now)  
                 println(2 days ago)  
                 println(3 days before)  
                 println(3 days after)  
                 println(4 days later)  
           }  
    }
環境2.8.1.final,另存爲xxx.scala文件
編譯>scala xxx.scala
運行>scala DSL

2010-12-12 17:57:04 => now...
2010-12-10 17:57:04
2010-12-09 17:57:04
2010-12-15 17:57:04
2010-12-16 17:57:04

用String作匹配固然能夠,我感受應該用Scala的自己特性來作介紹,這樣更能吸引讀者;
case class  用在模式匹配,能夠用來構建(複雜)表達式;
case object 在actor模型裏被當作消息用於模式匹配,固然還有別的功能; 


這個例子涉及到的知識點有:包引用,密封類,case object,隱式轉換,模式匹配,函數,apply方法;
開始我是用case class,有點冗餘,這裏只是當作消息處理,因而改爲case object;
解釋一下,運行2 days ago這行代碼,2是整型對象,它沒有days方法,就會在執行的上下文裏找一個隱式函數,這個隱式函數能夠把整型對象轉換成帶有days方法的目標對 象,若是預導入的PreDef對象內也含有一個作到上述功能的隱式函數,那麼編譯器會認爲這是衝突,沒法編譯:
Note that implicit conversions are not applicable because they are ambiguous
這裏我認爲,編譯器應該優先去找用戶自定義隱式函數,而不是報錯,呵呵,那樣的話編譯器要作更多的工做了。 app

相關文章
相關標籤/搜索