Scala中的简单隐式转换
我是scala的新手,到目前为止我非常喜欢它,但我遇到了一个非常奇怪的问题。我想通过实现D&D风格的骰子表达式来尝试隐式转换。i、 e.2d12“掷两个十二面骰子”。。。你知道我的意思 据我所知,scala应该能够编译这个Scala中的简单隐式转换,scala,dsl,Scala,Dsl,我是scala的新手,到目前为止我非常喜欢它,但我遇到了一个非常奇怪的问题。我想通过实现D&D风格的骰子表达式来尝试隐式转换。i、 e.2d12“掷两个十二面骰子”。。。你知道我的意思 据我所知,scala应该能够编译这个 (1 d 6).roll 甚至可能是这个 1d6 + 2 - 1d30 但在我的规范测试中,我得到了一个“值d不是int的成员”编译错误 package meh.toast import scala.util.Random object Dice { class D
(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
}
我真的卡住了。如果你能帮上忙,那就太棒了,可能真的很简单
提前感谢您已经非常接近了:但是您必须确保
Dice
对象中的隐式函数在您尝试使用它们的范围内:
scala> import Dice._
import Dice._
scala> (1 d 6).roll
res12: Int = 2
啊,我已经自己修好了。。。我没有导入所有正确的包。。。。为了使这个例子起作用,你不仅要导入meh.toast.\uh.toast.Dice.\uh.toast.Dice.\uu从你使用它的地方。我还发现了一件事(对于我和其他scala noobs)。。。1 d 6一定要小心:这个!已用作向Scala参与者发送消息的运算符。我在没有DSL的情况下(如,Die(1,6)),先让框架工作,然后再添加pimp DSL,作为一种改进,这是真的!甚至可能还有另一个隐式转换!如果我做对了,会导致奇怪的结果。我不认为整数文字也可以是演员,但我可能错了。但正如我所说,我只是在这里尝试:)我用过!只是因为当时是凌晨2:30,这是我第一次想到;)非常感谢你们!不客气。顺便说一句:只有演员的子类型是演员。:-)