代码之家  ›  专栏  ›  技术社区  ›  Yaneeve

如何引用作用域中两个函数具有相同名称的特定函数

  •  0
  • Yaneeve  · 技术社区  · 7 年前

    假设在作用域中有两个函数具有相同的名称,但参数列表不同。如何区分两者,例如在尝试访问 tupled

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    
    def f(s: String, l: Long): String = ???
    def f(i: Int, l: Long): String = ???
    
    val t:((String, Long)) => String = f.tupled
    
    // Exiting paste mode, now interpreting.
    
    <pastie>:15: error: ambiguous reference to overloaded definition,
    both method f of type (i: Int, l: Long)String
    and  method f of type (s: String, l: Long)String
    match expected type ?
    val t:((String, Long)) => String = f.tupled
    

    将问题简化为函数文字会产生:

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    def f(i: Int, l: Long): String = ???
    def f(s: String, l: Long): String = ???
    
    val g = f _
    
    // Exiting paste mode, now interpreting.
    
    <pastie>:15: error: ambiguous reference to overloaded definition,
    both method f of type (s: String, l: Long)String
    and  method f of type (i: Int, l: Long)String
    match expected type ?
    val g = f _
            ^
    

    apply 方法 不起作用

    scala>
    
    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    def f(s: String, l: Long): String = ???
    def f(i: Int, l: Long): String = ???
    
    val g: (String, Long) => String  = f _
    
    // Exiting paste mode, now interpreting.
    
    f: (s: String, l: Long)String <and> (i: Int, l: Long)String
    f: (s: String, l: Long)String <and> (i: Int, l: Long)String
    g: (String, Long) => String = $$Lambda$1458/794413935@60cbba57
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   dyrkin    7 年前

    以下是实现这一目标的方法

    val t1 = (f(_: String, _: Long)).tupled
    val t2 = (f(_: Int, _: Long)).tupled
    

    t1: ((String, Long)) => String = scala.Function2$$Lambda$1188/922196321@3994b698
    t2: ((Int, Long)) => String = scala.Function2$$Lambda$1188/922196321@4249db51
    
        2
  •  0
  •   Yaneeve    7 年前

    我发现了下面的黑客 tupled 问题:

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    def f(s: String, l: Long): String = ???
    def f(i: Int, l: Long): String = ???
    
    val g: (String, Long) => String  = f _
    val t = g.tupled
    
    // Exiting paste mode, now interpreting.
    
    f: (s: String, l: Long)String <and> (i: Int, l: Long)String
    f: (s: String, l: Long)String <and> (i: Int, l: Long)String
    g: (String, Long) => String = $$Lambda$1476/1981627424@172f2717
    t: ((String, Long)) => String = scala.Function2$$Lambda$259/530042637@bda4cbe
    
    推荐文章