我写了一个代表扑克牌的类。
可以这样写吗...

你好.scala
package example

import example.Suits._
import example.ValueHolder._

object Hello {
    def main(args: Array[String]) = {
        println(Ace of Spades)      // すごい
        println(2 of Diamonds)      // とてもすごい
    }
}

sealed trait Suits {
    def emoji: String
}

object Suits {
    object Diamonds extends Suits {
        override def emoji: String = "♦"
    }
    object Clubs extends Suits {
        override def emoji: String = "♣"
    }
    object Hearts extends Suits {
        override def emoji: String = "♥"
    }
    object Spades extends Suits {
        override def emoji: String = "♠"
    }

}

case class Card(
    val suits: Suits,
    val number: Int
) {
    override def toString(): String = {
        val numberString = number match {
            case 1  => "A"
            case 11 => "J"
            case 12 => "Q"
            case 13 => "K"
            case _  => number.toString()
        }
        s"(${suits.emoji},$numberString)"
    }
}

abstract class ValueHolder {
    val value: Int
    def of(suits: Suits): Card = Card(suits, value)
}

object ValueHolder {
    object Ace extends ValueHolder {
        override val value: Int = 1
    }

    implicit class IntValueHolder(override val value: Int)
        extends ValueHolder {}
}
输出
(♠,A)
(♦,2)

*生成像“2000 Hearts”这样的卡片的能力是一种魅力

评论

abstract class ValueHolder {
    val value: Int
    def of(suits: Suits): Card = Card(suits, value)
}

可以写成如下。

val v: ValueHolder = ??? // なんかうまいこと ValueHolder のインスタンスを生成する
val card = v.of(Spades)

Scala可以在某些条件下省略方法调用中的“。”并用空格代替它(显然),并且具有一个参数的方法可以用空格代替括号而不是将参数括在括号中(显然),因此以下可以写成

val card = v of Spades

而且

implicit class IntValueHolder(override val value: Int)
        extends ValueHolder {}

将允许Int 被视为ValueHolder,所以

val card = 2 of Diamonds

可以写成


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308628223.html

相关文章: