2012-04-10 137 views
1

我對scala非常陌生,迄今爲止我非常喜歡它,但我陷入了一個非常奇怪的問題。我想通過實現D & D風格的骰子表達式嘗試隱式轉換。即2d12「扔兩個十二面骰子」......你明白我的意思。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 
} 

我真的被卡住了。如果你能提供幫助,這將會非常棒,這可能很簡單。

在此先感謝

+0

AAAND我已經固定它自己......我沒有導入所有正確的軟件包......對於這個例子來說,你不僅需要導入包meh.toast._,還需要導入meh.toast.Dice._ '正在使用它。 – ParkL 2012-04-10 23:50:35

+0

我發現了另外一件事(對於我和其他scala noobs)...... 1 d 6必須<= 6才行,但1d6不行。這是因爲1d會將整型文字轉換爲double,編譯器不知道如何編譯6.因此,在現實生活中,「d」對於操作符名稱不是一個好選擇。 「!」很棒!可以做1!6 +2 – ParkL 2012-04-11 00:03:38

+0

只要小心:!已經被用作向Scala actor發送消息的操作符。我首先在沒有DSL的情況下製作了框架(如Die,(1,6)),並且稍後添加pimp DSL作爲優化,取得了很好的經驗。 – Madoc 2012-04-11 12:30:05

回答

3

你真正貼近:但你必須確保從Dice對象的隱函數在範圍上,當您嘗試使用它們:

scala> import Dice._ 
import Dice._ 

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