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
(可能通过隐式转换)。
我为度量单位编写了一个小型库(是的,我可以为此使用 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
(可能通过隐式转换)。