TupleとOOPの例

17945 ワード

Tupleは優雅なクラスで、異なるタイプのデータを同じコンテナに保存する簡単な方法を提供します.
class Person(var name: String)

次のような一時クラスを作成して情報を保存する必要はありません.
class SomeThings(i: Int, s: String, p: Person)

次のようにtupleを作成できます.
val t = (3, "Three", new Person("Al"))

いくつかの要素をカッコに入れるだけで、Tupleを作成します.Tupleでは2~22個の要素を保護できます.
Tupleの値へのアクセス
scala> val d = ("Maggie", 30)
d: (String, Int) = (Maggie,30)
scala> case class Person(name: String)
defined class Person

scala> val t = (3, "Three", new Person("David"))
t: (Int, java.lang.String, Person) = (3,Three,Person(David))

Tupleの要素にアクセスするには:
scala> t._1
res1: Int = 3

scala> t._2
res2: java.lang.String = Three

scala> t._3
res3: Person = Person(David)
scala> val(x, y, z) = (3, "Three", new Person("David"))
x: Int = 3
y: String = Three
z: Person = Person(David)

メソッドでTupleを返す
メソッドから複数の値を返したい場合:
def getStockInfo = {
     
    // other code here ...
    ("NFLX", 100.00, 101.00)  // this is a Tuple3
}
val (symbol, currentPrice, bidPrice) = getStockInfo

Tupleは集合クラスではないのでmap,fliterのような方法もありません.
OOPの例
Pizzaショップの受注入力システムを作成します.
sealed traitとcase objectの概念はまだ説明されていませんが、これらの列挙の意味を前から学ぶこともできます.
sealed trait Topping
case object Cheese extends Topping
case object Pepperoni extends Topping
case object Sausage extends Topping
case object Mushrooms extends Topping
case object Onions extends Topping

sealed trait CrustSize
case object SmallCrustSize extends CrustSize
case object MediumCrustSize extends CrustSize
case object LargeCrustSize extends CrustSize

sealed trait CrustType
case object RegularCrustType extends CrustType
case object ThinCrustType extends CrustType
case object ThickCrustType extends CrustType

クラスの定義
import scala.collection.mutable.ArrayBuffer
Pizza  :
class Pizza (
    var crustSize: CrustSize,
    var crustType: CrustType,
    var toppings: ArrayBuffer[Topping]
)

オーダー情報:
class Order (
    var pizzas: ArrayBuffer[Pizza],
    var customer: Customer
)

お客様情報:
class Customer (
    var name: String,
    var phone: String,
    var address: Address
)

アドレス:
class Address (
    var street1: String,
    var street2: String,
    var city: String,
    var state: String,
    var zipCode: String
)

いくつかの行為を加える
class Pizza (
    var crustSize: CrustSize,
    var crustType: CrustType,
    val toppings: ArrayBuffer[Topping]
) {
     

    def addTopping(t: Topping): Unit = toppings += t
    def removeTopping(t: Topping): Unit = toppings -= t
    def removeAllToppings(): Unit = toppings.clear()

}

直接価格を計算したいかもしれません.
def getPrice(
    toppingsPrices: Map[Topping, Int],
    crustSizePrices: Map[CrustSize, Int],
    crustTypePrices: Map[CrustType, Int]
): Int = ???

??? 文法もよく使われ、この方法はまだ実現されていないが、正常にコンパイルできることを示している.
class Order (
    val pizzas: ArrayBuffer[Pizza],
    var customer: Customer
) {
     

    def addPizza(p: Pizza): Unit = pizzas += p
    def removePizza(p: Pizza): Unit = pizzas -= p

    // need to implement these
    def getBasePrice(): Int = ???
    def getTaxes(): Int = ???
    def getTotalPrice(): Int = ???

}

テストしてみる
import scala.collection.mutable.ArrayBuffer

object MainDriver extends App {
     

    val p1 = new Pizza (
        MediumCrustSize,
        ThinCrustType,
        ArrayBuffer(Cheese)
    )

    val p2 = new Pizza (
        LargeCrustSize,
        ThinCrustType,
        ArrayBuffer(Cheese, Pepperoni, Sausage)
    )

    val address = new Address (
        "123 Main Street",
        "Apt. 1",
        "Talkeetna",
        "Alaska",
        "99676"
    )

    val customer = new Customer (
        "Alvin Alexander",
        "907-555-1212",
        address
    )

    val o = new Order(
        ArrayBuffer(p1, p2),
        customer
    )

    o.addPizza(
        new Pizza (
            SmallCrustSize,
            ThinCrustType,
            ArrayBuffer(Cheese, Mushrooms)
        )
    )

    // print the order
    o.printOrder

}