【问题标题】:Scala: Partially applied functionsScala:部分应用函数
【发布时间】:2013-05-27 18:57:38
【问题描述】:

我对 Scala 比较陌生,只是想了解如何使用部分应用的函数来解决我的问题。

我的问题是,在我的代码中,我在多个地方都有以下 foreach 逻辑:

for (teamType <- TeamType.allTypes) {
  findViewById(teamType.layoutID).findViewById(buttonID)
    .setOnClickListener(matchButtonOnClickListener)
}

又在这里:

for (teamType <- TeamType.allTypes) refreshTeamStatisticViews(teamType)

基本上,对于 TeamType 案例对象中的每个 teamType,我都希望执行一个返回 Unit 的函数

我想做的是将 foreach 部分移动到 TeamType 案例对象中,然后让它接受一个返回 Unit 的函数或部分应用的函数。

例如,TeamType 将包含以下内容:

def forAllTeamTypes(fun: TeamType => Unit) = for(teamType <- allTypes) fun(teamType) 

对于上面的第二个示例,我可以将其更改为

TeamType.forAllTeamTypes(refreshTeamStatisticViews)

但是,对于更复杂的第一个示例,我不确定如何将其应用于部分应用的函数。

有人可以帮我吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    简答:

    TeamType.forAllTeamTypes{ teamType =>
      findViewById(teamType.layoutID).findViewById(buttonID).setOnClickListener(matchButtonOnClickListener)
    }
    

    让我们看看你的代码:

    for (teamType <- TeamType.allTypes) {
      findViewById(teamType.layoutID).findViewById(buttonID).setOnClickListener(matchButtonOnClickListener)
    }
    

    actually means这个:

    TeamType.allTypes.foreach{ teamType =>
      findViewById(teamType.layoutID).findViewById(buttonID).setOnClickListener(matchButtonOnClickListener)
    }
    

    foreach 方法以TeamType =&gt; Unit 作为参数,就像你的方法forAllTeamTypes

    【讨论】:

      【解决方案2】:

      使用内置函数可能会更好。看起来.foreach 已经有了你想要的签名。

      它看起来像:

      TeamType.allTypes.foreach (functionOfYourChoosing)
      

      【讨论】:

      • 我的 TeamType 实际上是一个案例对象,而不是一个枚举。我应该澄清这一点
      • 在那里你可以定义一个成员allTypes,它是一个 List[TeamType] ?或者其他的东西。没有一个更简单和完整的例子很难判断:D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2012-03-14
      • 2012-12-27
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多