Scala,调用`map(f)`vs`map(v => f(v))时的不同行为

Dav*_*lla 7 scala

在调用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)

Ale*_*nov 1

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