函数参数可以在调用之前设置吗?

时间:2015-06-04 21:10:46

标签: scala

这里我创建一个对象列表,其中每个元素的类型(String,()=> Unit)

case class FunctionDesc(label: String, fun: () => Unit)
  def f() = {
    println("in f")
  }

  val functionList = List[FunctionDesc](FunctionDesc("a1", f), FunctionDesc("a2", f))

  functionList.foreach(f => f.fun())

这样可以正常工作但如果我想修改函数List以包含参数,则必须决定参数值 应该是在实现该功能时:

  case class FunctionDesc2(label: String, fun: (String) => Unit)
  def f2(str: String) = {
    println("in f2")
  }
  def f3(str: String) = {
    println("in f3")
  }
  val functionList2 = List[FunctionDesc2](FunctionDesc2("a3", f2), FunctionDesc2("a4", f3))
  functionList2.foreach(f => f.fun("param value"))

可以在调用之前决定函数参数类型应该是什么? 而不是

val functionList2 = List[FunctionDesc2](FunctionDesc2("a3", f2), FunctionDesc2("a4", f3))

使用类似的东西:

val functionList2 = List[FunctionDesc2](FunctionDesc2("a3", f2("f5")), FunctionDesc2("a4", f2("f6"))

2 个答案:

答案 0 :(得分:1)

您可以通过f2f3返回一个函数来实现此目的。这是一个简化版本:

case class FunctionDesc2(label: String, fun: (String) => Unit)

// `f` closes over `str` and returns a function from `String` to `Unit`
def f(str: String) = (s: String) => println(s"$str: $s")

val functionList = List(FunctionDesc2("a", f("foo")), FunctionDesc2("b", f("bar")))

functionList.foreach(_.fun("value"))
// foo: value
// bar: value

答案 1 :(得分:0)

你可以使用currying:

scala> case class FunctionDesc2(label: String, fun: () => Unit)
defined class FunctionDesc2

scala> def f2(str: String)(): Unit = {
     |   println("in f2")
     | }
f2: (str: String)()Unit

scala> def f3(str: String)(): Unit = {
     |   println("in f3")
     | }
f3: (str: String)()Unit

scala> val functionList2 = List[FunctionDesc2](FunctionDesc2("a3", f2("f5")), FunctionDesc2("a4", f3("f6")))
functionList2: List[FunctionDesc2] = List(FunctionDesc2(a3,<function0>), FunctionDesc2(a4,<function0>))

scala> functionList2.foreach(desc => desc.fun())
in f2
in f3