Scala中的简单隐式转换

时间:2012-04-10 23:45:14

标签: scala dsl

我对scala很新,到目前为止我真的很喜欢它,但我遇到了一个非常奇怪的问题。我想通过实现D& D风格的骰子表达来尝试隐式转换。即2d12“扔两个十二面骰子”......你知道我的意思。

根据我的理解,scala应该能够编译这个

(1 d 6).roll

甚至可能是这个

1d6 + 2 - 1d30

但是在我的specs测试中我得到了“值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 
}

我真的被困住了。如果你可以提供帮助,这将是非常棒的,它可能非常简单。

提前致谢

1 个答案:

答案 0 :(得分:3)

你真的很接近:但是当你试图使用它们时,你必须确保Dice对象中的隐式函数在范围内:

 scala> import Dice._
 import Dice._

 scala> (1 d 6).roll
 res12: Int = 2