Scala DSL:如何从应用调用中省略括号?

Scala DSL: How to omit parentheses from apply call?

我为度量单位编写了一个小型库(是的,我可以为此使用 squants,但我需要一些 squants 不提供的功能)。我的单位 class 是 UnitOfMeasure 数量,即数字和单位,是 Quantity.

假设我将 m 定义为 UnitOfMeasure,我想这样写:

val q = 3.0 m

我在包对象中创建了一个 class QuantityWrapper,如下所示:

implicit class QuantityWrapper[T](value: T)(implicit num: Numeric[T]) {

  def apply(unit: UnitOfMeasure[T]): Quantity[T] =
    Quantity(value, unit)
}

所以我现在可以做:

val q = 3.0(m)

因为 3.0 被隐式转换为 QuantityWrapper[Double] 并且 m 已经定义为 UnitOfMeasure[Double].

但我希望能够省略括号。如果不在 QuantityWrapper 中为我拥有的每个单元定义方法,这是否可能?

Is this possible without defining methods in QuantityWrapper for every unit I have?

没有。无论你做什么,3.0 m 将始终被解析为 (3.0).m,因此 Double 上必须存在一个方法 m(可能通过隐式转换)。