如果我有以下代码:
val wows = Buffer[Wow]()
def yo(f: _ => Wow) { wows += f }
我在尝试添加f时遇到错误。我想知道,我如何在方法体内使用f,或者更准确地说,我应该如何引用它,因为f
或f()
或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个基本类:
重点是Funset的“生成”函数集合可以在运行时编辑,这就是它被表示为缓冲区的原因。在每个更新周期,Emitter将每个Funsets函数传递给World的创建者函数,以显示世界中生成的对象。
我希望我已经解释过这样可以理解......可能是一个小小的混乱或错误的架构,但是......无论如何,我现在已经学到了关于Scala的一些知识!
答案 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参数仅在使用时计算表达式。传递一个函数实际上只是传递一个你可以随意调用的函数。