Quantity
という定義済みの値クラスに数値演算を追加しようとしています。私は次のように、これは使用していたコード...値のクラスを持つ暗黙的な変換とmkNumericOpsのスキャレート
import scala.language.implicitConversions
case class Quantity(value: Double) extends AnyVal
object Quantity {
implicit def mkNumericOps(lhs: Quantity): QuantityIsNumeric.Ops = QuantityIsNumeric.mkNumericOps(lhs)
}
object QuantityIsNumeric extends Numeric[Quantity] {
def plus(x: Quantity, y: Quantity): Quantity = Quantity(x.value + y.value)
def minus(x: Quantity, y: Quantity): Quantity = Quantity(x.value - y.value)
def times(x: Quantity, y: Quantity): Quantity = Quantity(x.value * y.value)
def negate(x: Quantity): Quantity = Quantity(-x.value)
def fromInt(x: Int): Quantity = Quantity(x.toDouble)
def toInt(x: Quantity): Int = x.value.toInt
def toLong(x: Quantity): Long = x.value.toLong
def toFloat(x: Quantity): Float = x.value.toFloat
def toDouble(x: Quantity): Double = x.value
def compare(x: Quantity, y: Quantity): Int = x.value compare y.value
}
次のように私はこのコードを使用して...
class SortedAskOrders[T <: Tradable] private(orders: immutable.TreeSet[LimitAskOrder[T]], val numberUnits: Quantity) {
def + (order: LimitAskOrder[T]): SortedAskOrders[T] = {
new SortedAskOrders(orders + order, numberUnits + order.quantity)
}
def - (order: LimitAskOrder[T]): SortedAskOrders[T] = {
new SortedAskOrders(orders - order, numberUnits - order.quantity)
}
def head: LimitAskOrder[T] = orders.head
def tail: SortedAskOrders[T] = new SortedAskOrders(orders.tail, numberUnits - head.quantity)
}
...私がしようとすると、このコードをコンパイルするとき、私は次のエラーを取得します..
Error:(29, 63) type mismatch;
found : org.economicsl.auctions.Quantity
required: String
new SortedAskOrders(orders + order, numberUnits + order.quantity)
明示的に暗黙の型変換使用+
方法の次の実装(私はすでにスコープ内にあるべきと思った!)動作します。
def + (order: LimitAskOrder[T]): SortedAskOrders[T] = {
new SortedAskOrders(orders + order, Quantity.mkNumericOps(numberUnits) + order.quantity)
}
コンパイラは、数値+
オペレータのための暗黙的な変換を見つけることができるとは思われません。思考?
暗黙的な変換とNumeric
特性を使用して、値クラスの数値演算を作成するのはかなり標準的だと思っていました。私は間違って何をしていますか?
あなたのファイルの上に 'import Quantity._'があるようです。 –
@YuriyGatilinしかし、インポートステートメントがなくても、コンパイラは減算演算子の暗黙の変換を見つけることができます。私は何か他のことが起こっていると思います... – davidrpugh
これは暗黙的なスコープ内/外での問題ではありません。他の操作( ' - '、 '*'など)は、苦情なしにコンパイルするようです。いいえ、コンパイラが暗黙的に探していないことはかなり明白です。なぜなら、 '+'は文字列の連結演算であり、すべてが文字列表現をしているので、暗黙の必要はありません。私は少なくとも1つの回避策を知っていますが、このことをより深く理解している誰かが、ストリングコンカットをオフにするクリーンでシンプルな手段で飛び立つことを望んでいました。 – jwvh