【问题标题】:scala : it is impossible to put a tuple as a function's argumentscala:不可能将元组作为函数的参数
【发布时间】:2015-07-03 12:52:45
【问题描述】:

我不能将元组作为方法参数传递:

scala> val c:Stream[(Int,Int,Int)]= Stream.iterate((1, 0, 1))((a:Int,b:Int,c:Int) => (b,c,a+b))
<console>:11: error: type mismatch;
 found   : (Int, Int, Int) => (Int, Int, Int)
 required: ((Int, Int, Int)) => (Int, Int, Int)

谢谢。

【问题讨论】:

    标签: scala tuples


    【解决方案1】:

    也可以使用tupled 选项:

    def a = (x:Int, y: Int, z: Int) => x + y + z).tupled
    val sum = a((1,2,3))
    

    【讨论】:

      【解决方案2】:

      lambda (a:Int,b:Int,c:Int) =&gt; (b,c,a+b) 是一个接受三个参数的函数。你希望它接受一个元组,所以你可以写((a:Int,b:Int,c:Int)) =&gt; (b,c,a+b)。但这会报错!

      error: not a legal formal parameter.
      Note: Tuples cannot be directly destructured in method or function parameters.
            Either create a single parameter accepting the Tuple3,
            or consider a pattern matching anonymous function: `{ case (param1, ..., param3) => ... }
             (((a:Int,b:Int,c:Int)) => (b,c,a+b))
               ^
      

      幸运的是,错误提示了一个解决方案:{ case (a, b, c) =&gt; (b, c, a+b) }

      【讨论】:

        【解决方案3】:

        正如函数字面量:

        (x:Int) => x + 1
        

        是一个参数的函数,如下

        (x:Int, y: Int, z: Int) => x + y + z
        

        是三个参数的函数,而不是 3 元组的一个参数

        您可以使用case 语句巧妙地完成这项工作:

        scala> val c: Stream[(Int,Int,Int)] = 
               Stream.iterate((1, 0, 1)){ case (a, b, c) => (b, c, a+b) }
        
        c: Stream[(Int, Int, Int)] = Stream((1,0,1), ?)
        

        另一种方法是传递元组,但由于所有_1 访问器,这真的很难看:

        scala> val c:Stream[(Int,Int,Int)] = 
                 Stream.iterate((1, 0, 1))( t => (t._2, t._3, t._1 + t._2) )
        
        c: Stream[(Int, Int, Int)] = Stream((1,0,1), ?)
        

        【讨论】:

        • 它有效,谢谢。事实上,我尝试过这样的事情(使用大小写),但我没有将大小写放在大括号之间。为什么简单的括号不起作用?
        • @lolveley 因为case 不是simple expression,这是() 参数列表中允许的全部
        • case 的另一个问题是,如果您的参数类型或数量不同步,您可能会遇到运行时错误。 :(
        • 在某些情况下,是的 - 但是这里的 Stream 已经被限制为 (Int,Int,Int) 所以 case 将永远成功
        【解决方案4】:

        我的猜测是表达式(a:Int,b:Int,c:Int) =&gt; (b,c,a+b) 定义了一个带有三个参数的 lambda,而您需要一个分解的参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-23
          • 2018-06-28
          • 1970-01-01
          • 2014-06-22
          • 1970-01-01
          • 1970-01-01
          • 2015-04-21
          相关资源
          最近更新 更多