加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的’Spread’参数?

发布时间:2020-12-16 09:26:59 所属栏目:安全 来源:网络整理
导读:有没有办法在给定数组的情况下调用带有单个参数的Scala函数(类似于JavaScript) ?ECMAScript 7)中的 Spreads? ys = [10.0,2.72,-3.14]f(x,...ys); 最干净的语法是: f(1,ys) 但这似乎不可能.即使f(1,ys:_ *)也不起作用(f(ys:_ *)也不起作用,因为编译器报告
有没有办法在给定数组的情况下调用带有单个参数的Scala函数(类似于JavaScript)
?ECMAScript 7)中的 Spreads?

ys = [10.0,2.72,-3.14]
f(x,...ys);

最干净的语法是:

f(1,ys)

但这似乎不可能.即使f(1,ys:_ *)也不起作用(f(ys:_ *)也不起作用,因为编译器报告的参数太少 – 只填充第一个参数).

例:

def f (a:Int,b:Float,c:Float,d:Float): String

val x  = 1
val ys = List(10.0,-3.14)  // note: non-Objects
val result = f(x,ys)  // intuitive,but doesn't work

用例:将测试数据(来自集合)注入到接受单个参数的现有方法中.由于这些是测试用例,如果ys中的#params不匹配并且给出运行时错误或不正确的结果,那就很好了.

问题是Scala是否允许一个干净的语法来调用一个带有单个参数的函数,给定一组参数 – 而不是它是否是一个好的设计(尽管意见肯定是受欢迎的).

解决方法

将列表作为元组传递并不容易,因为类型不匹配(稍后会详细介绍).有足够的鞋拔和润滑剂,但任何东西都适合:

"My hack" should {
  "allow a function to be called with Lists" in {

    def function(bar:String,baz:String)= bar+baz


    //turn the function into something that accepts a tuple
    val functionT = function _
    val functionTT = functionT.tupled

    val arguments = List("bar","baz")

    //Give the compiler a way to try and turn a list into a tuple of the size you need
    implicit def listToTuple(args:List[String]) = args match { 
      case List(a,b) => (a,b)
      case _ => throw IllegalArgumentException("Trying to pass off %s as a pair".format(args))
    }

    //Shove it in and hope for the best at runtime
    val applied = functionTT(arguments)
    applied === "barbaz"
  }
}

您可以通过向列表中添加其他参数来扩展此方法,或者通过Sch?nfinkling两个不同组中的参数来扩展此方法.我不会那样走.

从我的评论中你可能已经注意到我不喜欢导致这个问题弹出的设计.我展示的代码本质上是将函数包装在外观中的代码.为什么不做得好呢?

看看Spray你可能会发现他们的完整方法隐含地接受了大量不同的参数.他们已经使用了他们已经命名为Magnet Pattern的漂亮技巧.你可以做同样的事情,并为你选择接受的不同元组引入隐含的转换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读