加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么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的一个主要卖点就是打字更简单.但在这种情况下,它似乎更多的打字与更多的打字.

请告诉我:
1)我错过了,它以另一种形式存在,或者
2)它将被添加到未来版本的语言(并且它们将接受修补程序).

解决方法

您可以定义隐式转换:

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读