【问题标题】:Missing parameter type for expanded function SCALA扩展函数 SCALA 缺少参数类型
【发布时间】:2019-11-13 22:07:55
【问题描述】:

缺少扩展函数的参数类型

所以我的代码是:

var filter = availableRestaurants.filter(_ => commonOrder.contains(_.cuisine))

这会在“_.cuisine”处引发一个名为“缺少参数类型”的扩展函数错误。我也试过了:

var filter = availableRestaurants.filter(commonOrder.contains(_.cuisine))

commonOrder 是一个字符串列表 availableRestaurants 是一个对象列表,其中包含一个名为 cuisine 的字符串字段 重写这样的东西最好的方法是什么,或者这完全不合逻辑?

【问题讨论】:

    标签: scala


    【解决方案1】:

    首先,切勿在 Scala 中使用var除非你必须)。最好使用val

    var filter = availableRestaurants.filter(_ => commonOrder.contains(_.cuisine))
    

    这是给filter 函数一个匿名函数,它会丢弃它的第一个参数。但是您想使用包含检查的参数。 (函数调用中的_比较特殊,第二个不引用第一个)

    错误的原因是commonOrder.contains(_.cuisine)部分需要先(eta)展开,即。方法调用需要转换为函数,因为filter 需要一个函数。但是在不知道 _ 代表什么以及 _.cuisine 的类型是什么的情况下,这会失败。

    这样做:

    val filter = availableRestaurants.filter(r => commonOrder.contains(r.cuisine))
    

    或者,预先手动将方法扩展为函数:

    val containsCuisine = (r: Restaurant) => commonOrder.contains(r.cuisine)
    val filter = availableRestaurants.filter(containsCuisine)
    

    或者,使用构图,类似于你可以用镜头做的事情:

    val cuisineOf = (r: Restaurant) => r.cuisine // re-usable
    val filter = availableRestaurants.filter(cuisineOf andThen commonOrder.contains)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2020-08-04
      相关资源
      最近更新 更多