【问题标题】:How to restrict a anonymous function's boundary?如何限制匿名函数的边界?
【发布时间】:2010-10-12 23:37:11
【问题描述】:

我看到了下面的代码:

Map(1 -> "one", 2 -> "two") map _._1

这返回一个Iterable[Int],但是如果我不想对map做任何事情,该怎么做呢?

我想做类似下面的事情,但是下面的代码无法编译,我知道因为它是一个对象实例而不是一个函数,但是如何创建一个函数来执行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>

解析器似乎不确定将匿名函数的开头放在哪里。所以我的新问题是“如何帮助解析器限制匿名函数的边界?”

【问题讨论】:

  • 为什么需要使用map 来执行此操作? Map(1 -&gt; "one", 2 -&gt; "two").toIterable 还不够吗?
  • 很抱歉让您感到困惑,这只是我脑海中的一个问题,而不是一个真正的问题。没有理由这样做,只是想知道如何。

标签: scala function casting placeholder


【解决方案1】:

不确定我是否理解这个问题,但 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))

【讨论】:

  • :-) 想想这样的功能
  • 是的,这就是我想要的。使用 scala 内部方法来执行此操作。但是还有其他方法可以使用占位符来处理这个吗?这个问题只是来自我的疯狂想法,想知道为什么_ != x =&gt; x,为什么_ 不能代表像Predef.identity 这样的函数。这不是一个真正的问题。
【解决方案2】:

我找到了 Daniel 的答案 Anonymous functions and Maps in Scala ,这个答案让我清楚了在这种情况下解析器如何处理占位符。谢谢大家。

【讨论】:

    【解决方案3】:

    我看不到您在这里尝试做的任何价值,将集合映射到自身的正确方法不是调用 map!

    错误:

    Map(1 -> "one") map (_)
    

    对:

    Map(1 -> "one")
    

    它甚至没有用作浅拷贝操作,默认的 Scala Map 是不可变的,复制它没有任何意义。

    【讨论】:

    • 抱歉让您感到困惑,就像我上面的评论一样,这只是我脑海中的一个问题,而不是一个真正的问题。
    【解决方案4】:
    Map(1 -> "one") map((x)=>x)

    【讨论】:

    • 对不起,我知道可以,但我想使用占位符语法来做到这一点。
    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多