1

私はscalaにかなり慣れておらず、これまでのところ本当に気に入っていますが、本当に奇妙な問題に悩まされています。D&Dスタイルのサイコロ式を実装して暗黙の変換を試してみたかったのです。すなわち2d12「2つの12面のサイコロを投げる」...あなたは私が何を意味するか知っています。

私が理解していることから、scalaはこれをコンパイルできるはずです

(1 d 6).roll

そしておそらくこれさえ

1d6 + 2 - 1d30

しかし、スペックテストで「値dはintのメンバーではありません」というコンパイルエラーが発生します。

package meh.toast
import scala.util.Random

object Dice {
  class DiceSymbol(val amount:Int) {
    def d(sides:Int):Dice = new Dice(amount, sides)
  } 

  implicit def int2DiceSymbol(amount:Int) = new DiceSymbol(amount)
  implicit def dice2Int(d:Dice) = d.roll

  private val rnd = new Random()
  protected def throwDice(sides:Int) = rnd.nextInt(sides) + 1
}

class Dice(amount:Int, sides:Int) {
   def roll:Int = (1 to amount) map { _ => Dice.throwDice(sides)} sum 
}

私は本当に立ち往生しています。あなたが助けることができればそれは素晴らしいでしょう、それはおそらく本当に単純なものです。

前もって感謝します

4

1 に答える 1

3

あなたは本当に近いです:しかし、あなたがDiceそれらを使おうとするとき、あなたはオブジェクトからの暗黙の関数がスコープ内にあることを確認しなければなりません:

 scala> import Dice._
 import Dice._

 scala> (1 d 6).roll
 res12: Int = 2
于 2012-04-10T23:52:46.130 に答える