为什么Scala中单元素元组没有Tuple1 Literal?
发布时间:2020-12-16 09:10:41 所属栏目:安全 来源:网络整理
导读:Python对于单个元素元组具有(1,).在Scala中,(1,2)适用于Tuple2(1,2),但是我们必须使用Tuple1(1)获得单个元素元组.这可能看起来像一个小问题,但设计API希望产品是一个痛苦的交易,因为传递单个元素的用户,因为他们必须写Tuple1(1). 也许这是一个小问题,但Scala
Python对于单个元素元组具有(1,).在Scala中,(1,2)适用于Tuple2(1,2),但是我们必须使用Tuple1(1)获得单个元素元组.这可能看起来像一个小问题,但设计API希望产品是一个痛苦的交易,因为传递单个元素的用户,因为他们必须写Tuple1(1).
也许这是一个小问题,但Scala的一个主要卖点就是打字更简单.但在这种情况下,它似乎更多的打字与更多的打字. 请告诉我: 解决方法
您可以定义隐式转换:
implicit def value2tuple[T](x: T): Tuple1[T] = Tuple1(x) 隐式转换仅适用于参数的静态类型不符合方法参数的类型.假设你的方法需要一个Product参数 def m(v: Product) = // ... 转换将适用于非产品价值,但不适用于例如Tuple2.警告:所有案例类都会扩展“产品特征”,因此转换也不适用于它们.相反,product元素将是case类的构造函数参数. 产品是TupleX类的最小上限,但如果要将隐式Tuple1转换应用于所有非元组,则可以使用类型类: // given a Tupleable[T],you can call apply to convert T to a Product sealed abstract class Tupleable[T] extends (T => Product) sealed class ValueTupler[T] extends Tupleable[T] { def apply(x: T) = Tuple1(x) } sealed class TupleTupler[T <: Product] extends Tupleable[T] { def apply(x: T) = x } // implicit conversions trait LowPriorityTuple { // this provides a Tupleable[T] for any type T,but is the // lowest priority conversion implicit def anyIsTupleable[T]: Tupleable[T] = new ValueTupler } object Tupleable extends LowPriorityTuple { implicit def tuple2isTuple[T1,T2]: Tupleable[Tuple2[T1,T2]] = new TupleTupler implicit def tuple3isTuple[T1,T2,T3]: Tupleable[Tuple3[T1,T3]] = new TupleTupler // ... etc ... } 您可以在API中使用此类型的类,如下所示: def m[T: Tupleable](v: T) = { val p = implicitly[Tupleable[T]](v) // ... do something with p } 如果您的方法返回产品,您可以看到如何应用转化: scala> def m[T: Tupleable](v: T) = implicitly[Tupleable[T]](v) m: [T](v: T)(implicit evidence$1: Tupleable[T])Product scala> m("asdf") // as Tuple1 res12: Product = (asdf,) scala> m(Person("a","n")) // also as Tuple1,*not* as (String,String) res13: Product = (Person(a,n),) scala> m((1,2)) // as Tuple2 res14: Product = (1,2) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |