成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學習Scala中的Rational類:分數的模型化

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第六章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

Rational類的式樣書

分數:rational number是一種可以表達為比率n/d 的數字,這里的nd是數字,其中d不能為零。n被稱作是分子:numeratord被稱作是分母:denominator。分數的例子有:1/22/3112/2392/1 。與浮點數相比較,分數的優勢是小數部分得到了完全表達,沒有舍入或估算。

51CTO編輯推薦:Scala編程語言專題

本章我們將要設計的類必須模型化分數的行為,包括允許它們執行加,減,乘還有除運算。要加兩個分數,首先要獲得公分母,然后才能把兩個分子相加。例如,要計算1/2+2/3 ,先把左操作數的上下部分都乘上3,右操作數的兩部分都乘上2,得到了3/6+4/6 。把兩個分子相加產生結果,7/6 。要乘兩個分數,可以簡單的兩個分子相乘,然后兩個分母相乘。因此,1/2*2/5 得到了2/10 ,還可以簡化表示成它的“通常”形式1/5 。除法是把右操作數分子分母調換,然后做乘法。例如1/2/3/51/2*5/3相同,結果是5/6

一個或許不怎么重要的發現是,在數學上,分數不具有可變的狀態。一個分數加到另外一個分數上,產生的結果是一個新的分數。而原來的數不會被“改變”。我們將在本章設計的不可變的Rational類將秉承這一屬性。每個分數將都被表示成一個Rational對象。當兩個Rational對象相加時,一個新的帶著累加結果的Rational對象將被創建出來。

本章還將捎帶提一些Scala讓你寫出感覺像原生語言支持的庫的方法。例如,在本章結尾你將能用Rational類這樣做:

  1. scala> val oneHalf = new Rational(12)  
  2. oneHalf: Rational = 1/2 
  3. scala> val twoThirds = new Rational(23)  
  4. twoThirds: Rational = 2/3 
  5. scala> (oneHalf / 7) + (1 twoThirds)  
  6. res0: Rational = 17/42 
創建Rational類

開始設計Rational類的著手點是考慮客戶程序員將如何創建一個新的Rational對象。假設我們已決定讓Rational對象是不可變的,我們將需要那個客戶在創建實例時提供所有需要的數據(本例中,是分子和分母)。因此,我們應該這么開始設計:

  1. class Rational(n: Int, d: Int) 
這行代碼里首先應當注意到的是如果類沒有主體,就不需要指定一對空的大括號(當然你如果想的話也可以)。在類名,Rational,之后括號里的n和d,被稱為類參數:class parameter。Scala編譯器會收集這兩個類參數并創造一個帶同樣的兩個參數的主構造器:primary constructor

不可變對象的權衡

不可變對象提供了若干強于可變對象的優點和一個潛在的缺點。首先,不可變對象常常比可變對象更具邏輯性,因為它們沒有隨著時間而變化的復雜的狀態空間。其次,你可以很自由地傳遞不可變對象,而或許需要在把可變對象傳遞給其它代碼之前,需要先建造個以防萬一的副本。第三,沒有機會能讓兩個同時訪問不可變對象的線程破壞它合理構造的狀態,因為根本沒有線程可以改變不可變對象的狀態。第四,不可變對象讓哈希表鍵值更安全。比方說,如果可變對象在被放進了HashSet之后被改變,那么你下一次查找這個HashSet就找不到這個對象了。

不可變對象唯一的缺點就是它們有時需要復制很大的對象圖而可變對象的更新可以在原地發生。有些情況下這會變得難以快速完成而可能產生性能瓶頸。結果,要求庫提供可變替代以使其更容易在大數據結構的中間改變一些元素也并非是一件稀奇的事情。例如,類StringBuilder是不可變的String的可變替代。

注意

這個最初的Rational例子凸顯了Java和Scala之間的不同。Java類具有可以帶參數的構造器,而Scala類可以直接帶參數。Scala的寫法更簡潔——類參數可以直接在類的主體中使用;沒必要定義字段然后寫賦值函數把構造器的參數復制到字段里。這可以潛在地節省很多固定寫法,尤其是對小類來說。

Scala編譯器將把你放在類內部的任何不是字段的部分或者方法定義的代碼,編譯進主構造器。例如,你可以像這樣打印輸出一條除錯消息:

  1. class Rational(n: Int, d: Int) {  
  2.  println("Created "+n+"/"+d)  
  3. }  
根據這個代碼,Scala編譯器將把println調用放在Rational的主構造器。因此,println調用將在每次創建一個新的Rational實例時打印這條除錯信息:

  1. scala> new Rational(12)  
  2. Created 1/2 
  3. res0: Rational = Rational@a0b0f5 

【相關閱讀】

  1. Scala中的富包裝器:富操作和富類列表
  2. Scala操作符的優先級和關聯性
  3. Scala對象的相等性比較
  4. Scala的數學運算、關系和邏輯操作及位操作符
  5. Scala的操作符:任何方法都可以是操作符
責任編輯:book05 來源: Artima
相關推薦

2009-07-08 15:35:18

Case類Scala

2009-07-21 12:18:37

ScalaRational對象toString

2009-07-22 07:57:00

ScalaCurry化函數

2009-07-22 07:53:00

Scala擴展類

2009-07-20 16:56:51

Scala類的定義

2009-09-28 11:37:03

Journal.scaKestrel

2010-06-18 09:29:37

UML與Rationa

2009-07-21 16:58:31

Scala變量范圍

2009-07-22 07:43:00

Scala閉包

2009-11-16 17:04:46

Inside Scal

2012-11-23 14:28:45

IBMdW

2009-06-16 17:54:38

Scala類語法語義

2009-07-22 09:31:59

Scala類類層級Java類

2009-07-22 07:50:00

Scala二維布局庫抽象類

2009-09-09 11:37:08

Scala的模式匹配

2010-01-13 10:52:46

Rational Ro

2009-11-09 11:04:51

ibmdwRational

2014-04-23 09:21:38

大數據

2009-08-03 11:07:18

Scala Actor

2009-07-22 09:22:20

Scala工廠對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久亚洲一区二区 | 97精品视频在线 | 日本中出视频 | 久久久久久久久久久久久九 | 亚州中文字幕 | 亚洲一区二区三区四区五区午夜 | 日本xx视频免费观看 | 国产精品一区二区久久 | 久久国产三级 | 最新黄色在线观看 | 欧美伊人久久久久久久久影院 | 国产一区久久久 | 91精品国产乱码久久久久久久久 | 亚洲精品久久久久久国产精华液 | 成人在线欧美 | 国产精品成人一区 | 天天操网 | 国产成人精品亚洲日本在线观看 | 日本三级电影在线观看视频 | 久久新视频 | 欧美一级欧美一级在线播放 | 中文字幕 欧美 日韩 | 国产精品久久一区二区三区 | 精品一区国产 | 中文字幕一区二区视频 | 国产精品成人一区二区三区 | 韩日av片| www.天天操.com | 欧美一区二区三区四区在线 | 欧美精品福利视频 | 国产精品免费在线 | av超碰 | 亚洲午夜精品 | 黄色片网此| 日本一二区视频 | 黄色在线播放视频 | 成人免费网站视频 | 成人在线免费 | 日韩三级一区 | 日韩中文在线 | 日韩精品国产精品 |