【问题标题】:Simple implicit conversions in ScalaScala 中的简单隐式转换
【发布时间】: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 的子类型是演员。 :-)

标签: scala dsl


【解决方案1】:

你真的很接近:但是当你尝试使用它们时,你必须确保来自 Dice 对象的隐式函数在范围内:

 scala> import Dice._
 import Dice._

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多