Scala練習六
Scala中的物件&練習 |
1. 編寫一個Conversions物件,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法
程式程式碼:
- object Conversions {
- private val i2c=30.48
- private val g2l=3.785411784
- private val m2k=1.609344
- def inchesToCentimeters(inch:Double):Double={
- inch*i2c
- }
- def gallonsToLiters(gallon:Double):Double={
- gallon*g2l
- }
- def milesTokilometers(mile:Double):Double={
- mile*m2k
- }
- def main(args: Array[String]): Unit = {
- val inch=15
- val gallon=15
- val mile=15
- println(inch+"英尺= "+inchesToCentimeters(inch))
- println(gallon+"加侖= "+gallonsToLiters(gallon))
- println(mile+"公里= "+milesTokilometers(mile))
- }
- }
執行結果:
15英尺= 457.2
15加侖= 56.78117676
15公里= 24.14016
2. 前一個練習不是很面向物件。提供一個通用的超類UnitConversion並定義擴充套件該超類的InchesToCentimeters,GallonsToLiters和MilesToKilometers物件
程式程式碼:
- abstract class UnitConversion {
- def Converse(from:Double):Double
- }
- object inchesToCentimeters extends UnitConversion{
- private val i2c=30.48
- override def Converse(inche:Double):Double={
- inche*i2c
- }
- }
- object gallonsToLiters extends UnitConversion{
- private val g2l=3.785311784
- override def Converse(gallon:Double):Double={
- g2l*gallon
- }
- }
- object milesToKilometers extends UnitConversion{
- private val m2k=1.609344
- override def Converse(mile:Double):Double={
- m2k*mile
- }
- }
- object Test{
- def main(args: Array[String]): Unit = {
- val inche=10; val gallon=10; val mile=10
- println(inche+"英尺= "+inchesToCentimeters.Converse(inche)+"釐米")
- println(gallon+"加侖= "+gallonsToLiters.Converse(gallon)+"升")
- println(mile+"公里= "+milesToKilometers.Converse(mile)+"公里")
- }
- }
執行結果:
10英尺= 304.8 釐米
10加侖= 37.85311784 升
10公里= 16.09344 公里
3. 定義一個擴充套件自java.awt.Point的Origin物件。為什麼說這實際上不是個好主意 (仔細看Point類的方法)
描述:Point中的getLocation方法返回的是Point物件,如果想返回Origin物件,需要Origin類才行。Point有move方法,setLocation方法。這些作為Origin(原 點) 來說,都不是很合適
程式程式碼:
import java.awt.Point
object Origin extends Point with App{
override def getLocation:Point=super.getLocation()
Origin.move(2, 3)
println(Origin.toString())
}
4. 定義一個Point類和一個伴生物件,使得我們可以不用new而直接用Point(3,4)來構造Point例項
描述:apply方法使用
程式程式碼:
class Point(x:Int,y:Int) {
override def toString():String="x= "+x+" y= "+y
}
object Point extends App{
def apply(x:Int,y:Int)={
new Point(x,y)
}
val p=new Point(3,4)
println(p)
}
執行結果:
x= 3 y= 4
5. 編寫一個Scala應用程式,使用App特質,以反序列印命令列引數,用空格隔開。舉例來說,scala Reverse Hello World應該列印World Hello
程式程式碼:
object Reverse extends App{
for(str <- args.reverse)
println(str+" ")
}
執行結果:
6. 編寫一個撲克牌4種花色的列舉,讓其toString方法分別返回♣,♦,♥,♠
描述:這四個花色的符號win下選輸入法的特殊符號軟鍵盤。在lin下可以用vim。在vim中輸入:dig可以找到分別對應cS,cH,cD,cC。進入vim插入模式按<CTRL-K>,然後分別輸入即可
程式程式碼:
object PokerFace extends Enumeration {
type PokerFace=Value
val SPADES=Value("♠")
val HEARTS=Value("♥")
val DIAMONDS=Value("♢")
val CLUBS=Value("♧")
def main(args: Array[String]): Unit = {
for(poker <- PokerFace.values)
println(poker)
}
}
執行結果:
♠
♥
♢
♧
7. 實現一個函式,檢查某張牌的花色是否為紅色
程式程式碼:
- object Card extends Enumeration with App{
- val SPADES=Value("?")
- val HEARTS=Value("?")
- val DIAMONDS=Value("?")
- val CLUBS=Value("?")
- type Card=Value
- def color(c:Card)={
- if(c==Card.HEARTS||c==Card.DIAMONDS)
- println("Red")
- else
- println("Black")
- }
- color(SPADES)
- color(DIAMONDS)
- }
執行結果:
Black
Red
8. 編寫一個列舉,描述RGB立方體的8個角。ID使用顏色值(例如:紅色是0xff0000)
描述:RGB如果分別用8位表示,紅是0xff0000,綠是0x00ff00,藍是0x0000ff。以此類推 ,8個頂點分別是(0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) (1,0,1) (1,1,0) (1,1,1)
程式程式碼:
object RGB extends Enumeration with App {
val RED = Value(0xff0000,"Red")
val BLACK = Value(0x000000,"Black")
val GREEN = Value(0x00ff00,"Green")
val CYAN = Value(0x00ffff,"Cyan")
val YELLOW = Value(0xffff00,"Yellow")
val WHITE = Value(0xffffff,"White")
val BLUE = Value(0x0000ff,"Blue")
val MAGENTA = Value(0xff00ff,"Magenta")
}