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
}
我真的被卡住了。如果你能提供幫助,這將會非常棒,這可能很簡單。
在此先感謝
AAAND我已經固定它自己......我沒有導入所有正確的軟件包......對於這個例子來說,你不僅需要導入包meh.toast._,還需要導入meh.toast.Dice._ '正在使用它。 – ParkL 2012-04-10 23:50:35
我發現了另外一件事(對於我和其他scala noobs)...... 1 d 6必須<= 6才行,但1d6不行。這是因爲1d會將整型文字轉換爲double,編譯器不知道如何編譯6.因此,在現實生活中,「d」對於操作符名稱不是一個好選擇。 「!」很棒!可以做1!6 +2 – ParkL 2012-04-11 00:03:38
只要小心:!已經被用作向Scala actor發送消息的操作符。我首先在沒有DSL的情況下製作了框架(如Die,(1,6)),並且稍後添加pimp DSL作爲優化,取得了很好的經驗。 – Madoc 2012-04-11 12:30:05