在调用map(f)vs 时我得到了不同的行为map(v => f(v)).为什么?
libraryDependencies += "com.lihaoyi" %% "pprint" % "0.4.1"
case class Entry(id: Int, text: String)
val entry = Entry(1, "hello")
def toPrettyString[T](o: T)(implicit pp: pprint.PPrint[T]) =
pprint.tokenize(o)(pp).mkString
println(toPrettyString(entry)) // I get Entry(1, "hello"), as expected
List(entry).map(toPrettyString).foreach(println) // I get Entry(1,hello), not what I want
List(entry).map(e => toPrettyString(e)).foreach(println) // I get Entry(1, "hello"), as expected
Run Code Online (Sandbox Code Playgroud)
Eta 扩展(将toPrettyString用作值的方法转换为匿名函数)发生在类型参数推断之前,您可以将其视为等效于
def toPrettyString1[T]: T => String =
(x: T) => toPrettyString(x)
List(entry).map(toPrettyString1)
Run Code Online (Sandbox Code Playgroud)
在 中,必须选择仅调用 的toPrettyString1默认隐式实例。PPrinttoString
在 中List(entry).map(e => toPrettyString(e)),类型 ofe被推断为Entry,因此宏生成正确的隐式。
https://issues.scala-lang.org/browse/SI-7641
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |