2012-04-10 18 views
1

私はスカラーにとっては新しく、これまでのところ本当に好きですが、本当に奇妙な問題が残っています。 D & Dスタイルのダイス式を実装して暗黙的な変換を試したかったのです。すなわち2d12は「2つの12面のサイコロを投げる」...あなたは私が何を意味するかを知っている。私は、Scalaはこの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 
} 

私は本当に立ち往生しています。もしあなたが助けることができればそれは素晴らしいでしょう、それはおそらく本当に単純なものです。事前

+0

AAAND私自身は...私はすべての適切なパッケージをインポートしませんでした....この例では、パッケージmeh.toast._だけでなく、meh.toast.Dice._からインポートする必要がありますそれを使用しています。 – ParkL

+0

と私はもう一つのことを見つけました(私と他のscala noobsのために)... 1 d 6は6以下でなければなりませんが、1 d 6はうまくいきます。これは、1dがintリテラルをdoubleに変換し、コンパイラが6の何を作るべきかを知らないためです。したがって、実生活では、 "d"は演算子名にとって非常に良い選択ではありません。 "!"よく働く!できます1!6 +2 – ParkL

+0

ちょうど注意してください:! Scalaアクターにメッセージを送信するための演算子として既に使用されています。 DSLのないフレームワークを最初に作って(Die(1,6)のように)、pimp DSLを後で追加するという良い経験をしました。 – Madoc

答えて

3

おかげであなたは本当に近いです:しかし、あなたは、あなたがそれらを使用しようとすると、Diceオブジェクトから暗黙の関数がスコープ内にあることを確認する必要があります:私はすでに固定

scala> import Dice._ 
import Dice._ 

scala> (1 d 6).roll 
res12: Int = 2 
関連する問題