Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的简单隐式转换_Scala_Dsl - Fatal编程技术网

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

我是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 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,这是我第一次想到;)非常感谢你们!不客气。顺便说一句:只有演员的子类型是演员。:-)