我看到了以下代码:
Map(1 -> "one", 2 -> "two") map _._1
这会返回一个Iterable [Int],但如果我想对地图不做任何事,该怎么做?
我想做类似下面的事情,但是下面的代码无法编译,我知道因为它是一个对象实例而不是一个函数,但是如何创建一个函数来做x => x
并使用占位符:
Map(1 -> "one") map (_) // map (Int, String) to (Int, String) by nothing change
// I test some other way, but all can't compile
怎么做?
已更新
对不起,因为迷惑热情的人。我想知道为什么map (_) != map (x => x)
,编译器将此代码转换为(x$1) => Map(1.$minus$greater("one")).map(x$1)
为什么不Map('a'.$minus$greater(1)).map((x$1) => x$1)
,并且有没有办法可以使用_
生成此代码?
我使用下面的代码来帮助编译器推断出_
类型:
Map(1 -> "one") map (_:((Int, String))=>(Int, String))
// but it return (((Int, String)) => (Int, String)) => scala.collection.immutable.Map[Int,String] = <function1>
似乎解析器不知道在哪里放置匿名函数的开头。所以我的新问题是“如何帮助解析器限制匿名函数的边界?”
答案 0 :(得分:2)
我不确定我是否理解这个问题,但identity
可能正是您所寻找的:
scala> Map(1 -> "one") map (identity)
res66: scala.collection.mutable.Map[Int,java.lang.String] = Map((1,one))
或者,做一些技巧:
scala> def __[A](x: A): A = x
__: [A](x: A)A
scala> Map(1 -> "one") map (__)
res1: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one))
答案 1 :(得分:2)
我找到Daniel的回答,Anonymous functions and Maps in Scala,这个答案让我清楚解析器在这种情况下如何处理占位符。谢谢大家。
答案 2 :(得分:1)
我看不到你在这里尝试做什么的任何价值,将集合映射到自身的正确方法不是调用地图!
错:
Map(1 -> "one") map (_)
右:
Map(1 -> "one")
它甚至不能用作浅拷贝操作,默认的Scala Map是不可变的,复制它没有意义。
答案 3 :(得分:0)
Map(1 -> "one") map((x)=>x)