【发布时间】:2012-04-10 23:45:13
【问题描述】:
我对 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
}
我真的被困住了。如果你能帮忙就太好了,这可能很简单。
提前致谢
【问题讨论】:
-
aa而且我自己已经修复了...我没有导入所有正确的包...。要使此示例正常工作,您不仅要导入包 meh.toast._还有 meh.toast.Dice._ 从你使用它的地方。
-
我又发现了一件事(对我和其他 scala 菜鸟来说)...... 1 d 6 must be
-
小心点:!已经被用作向 Scala Actor 发送消息的操作符。我首先使框架在没有 DSL 的情况下工作(如 Die(1, 6)),然后添加 pimp DSL,作为改进。
-
这是真的!甚至可能还有另一个隐式转换!如果我做对了,定义会导致奇怪的结果。我不认为整数文字也可以是演员,但我可能错了。但正如我所说,我只是在这里尝试:) 我用过!只是因为现在是凌晨 2:30,这是我想到的第一个 ;) 非常感谢你们!
-
不客气。顺便说一句:只有 Actor 的子类型是演员。 :-)