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
}
私は本当に立ち往生しています。もしあなたが助けることができればそれは素晴らしいでしょう、それはおそらく本当に単純なものです。事前
AAAND私自身は...私はすべての適切なパッケージをインポートしませんでした....この例では、パッケージmeh.toast._だけでなく、meh.toast.Dice._からインポートする必要がありますそれを使用しています。 – ParkL
と私はもう一つのことを見つけました(私と他のscala noobsのために)... 1 d 6は6以下でなければなりませんが、1 d 6はうまくいきます。これは、1dがintリテラルをdoubleに変換し、コンパイラが6の何を作るべきかを知らないためです。したがって、実生活では、 "d"は演算子名にとって非常に良い選択ではありません。 "!"よく働く!できます1!6 +2 – ParkL
ちょうど注意してください:! Scalaアクターにメッセージを送信するための演算子として既に使用されています。 DSLのないフレームワークを最初に作って(Die(1,6)のように)、pimp DSLを後で追加するという良い経験をしました。 – Madoc