Scala:如何访问在其他代码块中定义的方法中的变量

Scala: how to access variables in a method defined in some other block of code

我有以下代码:

.hof((key, value) => {
    Some(..some processing result on key,value)
      .filterNot(_.isEmpty)
      .map(x: X => {....my code processing x using key,value with output y})
  }
)

我想抽象出我传递给映射到 class 中定义的方法的函数。

def myMethod(x: X) = {
   y = ....some computation....
   return y
}

但我需要访问 myMethod 中的键值。

有办法吗?

您可以用柯里化形式定义 myMethod

def myMethod(key: Key, value: Value)(x: X) = {
  ... uses key and value ...
}

然后您可以在 map 中部分应用它,将它传递给您当时拥有的 key/value 对:

.map(myMethod(key, value))

请注意,将 key/value 对添加到 myMethod 签名并不是某种 "cheating";如果该方法需要使用键和值,则应将它们作为参数传递。

这就是 FP 的伟大之处;一旦每个函数都声明了它所操作的所有参数,您就可以轻松地组合它们。

当然,您可以简单地将 myMethod 放置在 keyvalue 可以访问的范围内的某处(=闭包),但是通过将它们声明为参数,您更灵活,您可以将方法放在任何您想要的地方。

您可以像这样在本地定义方法:

.hof((key, value) => {
  def myMethod(x: X) = {
   ???
  }

  Some(..some processing result on key,value)
    .filterNot(_.isEmpty)
    .map(myMethod)
  }
)

否则你将不得不将 (key, value) 作为参数传递给函数。

(请参阅@slouc 的回答以获取有关如何使用柯里化使此更清洁的技巧)