freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文翻譯--面向java開發(fā)人員的scala指南類操作-資料下載頁

2025-05-11 17:34本頁面

【導(dǎo)讀】I&#39;llpointitout.Scalahasclass(es),too. Listing1.classRational(n:Int,d:Int). {. privatedefgcd(x:Int,y:Int):Int=. {. if(x==0)y. elseif(x<0)gcd(-x,y). elseif(y<0)-gcd(x,-y). -2-. elsegcd(y%x,x). }. privatevalg=gcd(n,d). valnumer:Int=n/g. valdenom:Int=d/g. def+(that:Rational)=. newRational(numer*+*denom,denom*). def-(that:Rational)=. newRational(numer*-*denom,denom*). def*(that:Rational)=. newRational(numer*,denom*). def/(that:Rational)=. newRational(numer*,denom*). "Rational:["+numer+"/"+denom+"]". }. classRational(n:Int,d:Int). {. //...asbefore. }. {. valr1=newRational(1,3). valr2=newRational(2,5). valr3=r1-r2. valr4=r1+r2. -3-. }

  

【正文】 4個(gè)名稱比較古怪的方法: +、 、 * 和 /。 與其外表相反,這并非操作符重載。 操作符 記住,在 Scala中 一切都是對(duì)象 。在上一篇 文章 中 , 您看到了函數(shù)本身也是對(duì)象這一原則的應(yīng)用,這使 Scala程序員可以將函數(shù)賦予變量,將函數(shù)作為對(duì)象參數(shù)傳遞等等。另一個(gè)同樣重要的原則是 , 一切都是函數(shù) ;也就是說,在此處,命名為 add的函數(shù)與命名為 + 的函數(shù)沒有區(qū)別。在 Scala中,所有操作符都是類的函數(shù)。只不過它們的名稱比較古怪罷了。 在 Rational 類中,為有理數(shù)定義了 4種操作。它們是規(guī)范的數(shù)學(xué)操作:加、減、乘、除。每種操作以它的數(shù)學(xué)符號(hào)命名: +、 、 * 和 /。 但是請(qǐng)注意,這些操作符每次操作時(shí)都構(gòu)造一個(gè)新的 Rational 對(duì)象。同樣,這與,這是默認(rèn)的實(shí)現(xiàn),因?yàn)檫@樣可以產(chǎn)生線程安全的代碼(如果線程沒有修改共享狀態(tài) —— 默認(rèn)情況下,跨線程共享的對(duì)象的內(nèi)部狀態(tài)也屬于共享狀態(tài) —— 則不 會(huì)影響對(duì)那個(gè)狀態(tài)的并發(fā)訪問)。 有什么變化? 一切都是函數(shù) , 這一規(guī)則產(chǎn)生兩個(gè)重要影響: 首先,您已經(jīng)看到,函數(shù)可以作為對(duì)象進(jìn)行操縱和存儲(chǔ)。這使函數(shù)具有強(qiáng)大的可重用性,本系列 第一篇文章 對(duì)此作了探討。 第二個(gè)影響是, Scala語言設(shè)計(jì)者提供的操作符與 Scala程序員認(rèn)為 應(yīng)該 提供的操作符之間沒有特別的差異。例如,假設(shè)提供一個(gè) “求倒數(shù) ”操作符 , 這個(gè)操作符會(huì)將分子和分母調(diào)換 , 返回一個(gè)新的 Rational(即對(duì)于 Rational(2,5)將返 回 Rational( 5, 2)) 。如果您認(rèn)為 ~符號(hào)最適合表示這個(gè) 概念,那么可以使用此符號(hào)作為名稱定義一個(gè)新方法,該方法將和 Java代碼中任何其他操作符一樣,如清單 5所示 :清單 5. 求倒數(shù) val r6 = ~r1 17 (r6) // should print [3 / 1], since r1 = [1 / 3] 在 Scala 中定義這種一元操作符 ”需要一點(diǎn)技巧,但這只是語法上的問題而已: 清單 6. 如何求倒數(shù) class Rational(n:Int, d:Int) { // ... as before ... def unary_~ : Rational = new Rational(denom, numer) } 當(dāng)然,需要注意的地方是,必須在名稱 ~之前加上前綴 “unary_”, 告訴 Scala編譯器它屬于一元操作符。因此,該語法將顛覆大多數(shù)對(duì)象語言中常見的傳統(tǒng) reference thenmethod語法。 這條規(guī)則與 “一切都是對(duì)象 ” 規(guī)則結(jié)合起來,可以實(shí)現(xiàn)功能強(qiáng)大(但很簡(jiǎn)單)的代碼: 清單 7. 求和 1 + 2 + 3 // same as 1.+(2.+(3)) r1 + r2 + r3 // same as r1.+(r2.+(r3)) 當(dāng)然,對(duì)于簡(jiǎn)單的整數(shù)加法, Scala 編譯器也會(huì) “得到正確的結(jié)果 ”,它們?cè)谡Z法上是完全一樣的。這意味著您可以開發(fā)與 Scala語言 “內(nèi)置 ”的類型完全相同的類型。 Scala編譯器甚至?xí)L試推斷具有某種預(yù)定含義的 “操作符 ”的其他含義,例如 += 操作符。注意,雖然 Rational 類并沒有顯式地定義 +=,下面的代碼仍然會(huì)正常運(yùn)行: 清單 8. Scala 推斷 var r5 = new Rational(3,4) r5 += r1 (r5) 打印結(jié)果時(shí), r5的值為 [13 / 12],結(jié)果是正確的。 Scala 內(nèi)幕 記住, Scala將被編譯為 Java字節(jié)碼,這意味著它在 JVM上運(yùn)行。如果您需要證據(jù),那么只需注意編譯器生成以 0xCAFEBABE開頭的 .class 文件,就像 javac一樣。另外請(qǐng)注意,如果啟動(dòng) JDK自帶的 Java字節(jié)碼反編譯器( javap),并將它指向生成的 Rational類,將會(huì)出現(xiàn)什么情況,如清單 9所示: 清單 9. 從 編譯的類 18 C:\Projects\scalaclasses\codejavap private classpath classes Rational Compiled from public class Rational extends implements { private int denom。 private int numer。 private int g。 public Rational(int, int)。 public Rational unary_$tilde()。 public toString()。 public Rational $div(Rational)。 public Rational $times(Rational)。 public Rational $minus(Rational)。 public Rational $plus(Rational)。 public int denom()。 public int numer()。 private int g()。 private int gcd(int, int)。 public Rational(int)。 public int $tag()。 } C:\Projects\scalaclasses\code Scala類中定義的 “操作符 ”被轉(zhuǎn)換成傳統(tǒng) Java編程中的方法調(diào)用,不過它們?nèi)允褂每瓷先ビ行┕殴值拿Q。類中定義了兩個(gè)構(gòu)造函數(shù):一個(gè)構(gòu)造函數(shù)帶有一個(gè) int參 數(shù),另一個(gè)帶有兩個(gè) int參數(shù)。您可能會(huì)注意到,大寫的 Int類型與 有點(diǎn)相似, Scala編譯器非常聰明,會(huì)在類定義中將它們轉(zhuǎn)換成常規(guī)的 Java原語 int。 測(cè)試 Rational 類 一種著名的觀點(diǎn)認(rèn)為,優(yōu)秀的程序員編寫代碼,偉大的程序員編寫測(cè)試;到目前為止,我還沒有對(duì)我的 Scala代碼嚴(yán)格地實(shí)踐這一規(guī)則,那么現(xiàn)在看看將這個(gè) Rational 類放入一個(gè)傳統(tǒng)的 JUnit測(cè)試套件中會(huì)怎樣,如清單 10所示: 清單 10. import .*。 import static .*。 public class RationalTest { 19 @Test public void test2ArgRationalConstructor() { Rational r = new Rational(2, 5)。 assertTrue(() == 2)。 assertTrue(() == 5)。 } @Test public void test1ArgRationalConstructor() { Rational r = new Rational(5)。 assertTrue(() == 0)。 assertTrue(() == 1)。 // 1 because of gcd() invocation during construction。 // 0over5 is the same as 0over1 } @Test public void testAddRationals() { Rational r1 = new Rational(2, 5)。 Rational r2 = new Rational(1, 3)。 Rational r3 = (Rational) reflectInvoke(r1, $plus, r2)。 //r1.$plus(r2)。 assertTrue(() == 11)。 assertTrue(() == 15)。 } // ... some details omitted } 除了確認(rèn) Rational 類運(yùn)行正常之外,上面的測(cè)試套件還證明可以從 Java代碼中調(diào)用 Scala代碼(盡管在操作符方面有點(diǎn)不匹配)。當(dāng)然,令人高興的是,您可以將 Java類遷移至 Scala類,同時(shí)不必更改支持這些類的測(cè)試,然后慢慢嘗試 Scala。 您惟一可能覺得古怪的地方是操作符調(diào)用,在本例中就是 Rational 類中的 + 方法?;仡櫼幌?javap的輸出, Scala顯然已經(jīng)將 +函數(shù)轉(zhuǎn)換為 JVM方法 $plus,但是 Java語言規(guī)范并不允許標(biāo)識(shí)符中出現(xiàn) $字符(這正是它被用于嵌套和匿名嵌套類名稱中的原因)。 為了調(diào)用那些方法,需要用 Groovy或 JRuby(或者其他對(duì) $字符沒有限制的語言)編寫測(cè)試,或者編寫 Reflection代碼來調(diào)用它。我采用后一種方法,從 Scala的角度看這不是那么有趣,但是如果您有興趣的話,可以看看本文的代碼中包含的結(jié)果(參見 下載 )。 20 注意,只有當(dāng)函數(shù)名稱不是合法的 Java標(biāo)識(shí)符時(shí)才需要用這類方法。 “更好的 ” Java 我學(xué)習(xí) C++的時(shí)候 Bjarne Stroustrup 建議,學(xué)習(xí) C++的一種方法是將它看作 “更好的C語言 ”(參見 參考資料 )。在某些方面,如今的 Java開發(fā)人員也可以將 Scala看作是“更好的 Java”,因?yàn)樗峁┝艘环N編寫傳統(tǒng) Java POJO的更簡(jiǎn)潔的方式??紤]清單 11中顯示的傳統(tǒng) Person POJO: 清單 11. (原始 POJO) public class JavaPerson { public JavaPerson(String firstName, String lastName, int age) { = firstName。 = lastName。 = age。 } public String getFirstName() { return 。 } public void setFirstName(String value) { = value。 } public String getLastName() { return 。 } public void setLastName(String value) { = value。 } public int getAge() { return 。 21 } public void setAge(int value) { = value。 } public String toString() { return [Person: firstName + firstName + lastName: + lastName + age: + age + ]。 } private String firstName。 private String lastName。 private int age。 } 現(xiàn)在考慮用 Scala 編寫的對(duì)等物: 清單 12. (線程安全的 POJO) class Person(firstName:String, lastName:String, age:Int) { def getFirstName = firstName def getLastName = lastName def getAge = age override def toString = [Person firstName: + firstName + lastName: + lastName + age: + age + ] } 這不是一個(gè)完全匹配的替換,因?yàn)樵嫉?Person包含一些可變的 setter。但是,由于原始的 Person沒有與這些可變 setter 相關(guān)的同步代碼,所以 Scala 版本使用起來更安全。而且,如果目標(biāo)是減少 Person中的代碼行數(shù),那么可以刪除整個(gè) getFoo屬性方法,因?yàn)?Scala將為每個(gè)構(gòu)造函數(shù)參數(shù)生成 accessor 方法 —— firstName()返回一個(gè) String,lastName()返回 一個(gè) String, age()返回一個(gè) int。 即使必須包含這些可變的 setter 方法, Scala版本仍然更加簡(jiǎn)單,如清單 13所示: 清單
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1