Scala - 使用带_参数的传递函数

时间:2012-02-16 19:15:52

标签: function scala

如果我有以下代码:

val wows = Buffer[Wow]()

def yo(f: _ => Wow) { wows += f }

我在尝试添加f时遇到错误。我想知道,我如何在方法体内使用f,或者更准确地说,我应该如何引用它,因为ff()f(_)不起作用。

更新

f的类型无法更改为f: => Wow,因为传递给此方法的类型_ => Wow的函数来自此类:

object Wonderful {

    val wows = Buffer[Wow]()

    def yo(f: _ => Wow) { wows += f }
}

class Joy[+R](fs: Buffer[_ => R]) {

    def exalt() {
        fs.map(Wonderful.yo(_))
    }
}

并且该缓冲区无法使用=> R进行参数化,它会显示错误。

更新2:在我完成第二部分的解释之前,你们都有第二个答案!谢谢!那是速度!

更新3:基本上,我正在学习Scala,我正试图尝试所有我能想到的。在这段特殊的代码中,会发生以下事情:我有3个基本类:

  • WorldObject - 代表所有游戏对象(包含x,y等)。
  • 发射器 - 代表随时间发射物体的东西(扩展WorldObject)。
  • Funset - 一组在调用时应生成WorldObjects的函数。将来我想用部分准备好的参数使它们部分应用,直接传递给相应的工厂方法。
  • 世界 - 一切都在发生。

重点是Funset的“生成”函数集合可以在运行时编辑,这就是它被表示为缓冲区的原因。在每个更新周期,Emitter将每个Funsets函数传递给World的创建者函数,以显示世界中生成的对象。

我希望我已经解释过这样可以理解......可能是一个小小的混乱或错误的架构,但是......无论如何,我现在已经学到了关于Scala的一些知识!

2 个答案:

答案 0 :(得分:4)

你追求的是名字参数吗?如果是这样,你的语法有点偏。这是正确的方法:

scala> class Wow
defined class Wow

scala> val wows = collection.mutable.Buffer.empty[Wow]
wows: scala.collection.mutable.Buffer[Wow] = ArrayBuffer()

scala> def yo(f: => Wow) { wows += f }
yo: (f: => Wow)Unit

答案 1 :(得分:2)

_ => Wow是一种方法,它接受您不知道的类型的单个参数并返回Wow。你将无法调用它,因为你不知道用什么类型的参数调用它!

我怀疑你想要一个没有参数的方法,你可以这样做:

def yo( f: () => Wow ) { wows += f() }

你也可以做一个更隐蔽的by-name parameter

def you( f: => Wow ) { wows += f }

编辑:区别在于你如何称呼它; by-name参数仅在使用时计算表达式。传递一个函数实际上只是传递一个你可以随意调用的函数。