【问题标题】:How to pass List to Int* method in Scala?如何将 List 传递给 Scala 中的 Int* 方法?
【发布时间】:2012-09-15 09:59:24
【问题描述】:

我有一个函数:

def test(ints: Int*) = ints.foreach(println(_))

如何将 Array[Int] 或 Seq[Int] 转换为 Int*?

【问题讨论】:

  • 注意:这不是一个函数。那是一种方法。两者本质上是不同的。
  • 第二个注意事项:由于test 是一种副作用方法,因此更习惯将其声明为def test(…) { … },即没有= 等号。此外,循环语句可能更惯用地写为ints foreach println,即使用隐式 η 转换而不是显式。

标签: scala


【解决方案1】:

这就是 _* 类型归属的用途:

def test(ints: Int*) { ints foreach println }

val l = List(1, 2, 3)

test(l:_*)
// 1
// 2
// 3

【讨论】:

  • :_* 到底是什么东西?是演员表吗?它会调用列表中的某个方法吗?它是否适用于任何扩展某些特征的类型?
  • @FredOverflow:它“只是”一些语法糖来告诉编译器你想要传递集合的成员而不是集合本身。
  • @FredOverflow:冒号: 只是一个类型归属。这就是 Scala 中类型的归属方式,例如1Int1: LongLong_* 是一种“魔术”类型,它表示“将此序列(这就是*)转换为序列的元素类型(即_ 部分)的参数列表”。它与 parameter 类型中的* 后缀完全相反(例如Int*),它表示“将这些参数转换为序列”。它适用于任何<% Seq。见第scala-lang.org/docu/files/ScalaReference.pdf 中的 78 个。
  • 更准确地说:如果重复的方法参数类型声明为T*,那么您可以传递任何C[T],其中C <: SeqS <: T。请注意,这与通配符序列模式匹配的语法相同。
猜你喜欢
  • 2017-08-06
  • 2014-06-03
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多