Scala返回一个函数:多个嵌套函数

时间:2018-02-06 02:25:47

标签: scala nested-function

我正在尝试创建一个函数,它将返回另一个将执行多个字符串操作的函数(由给定的选项决定): 选项为U(大写),l(小写)T(标题大小写)s(已排序)r(反向)和{{1} }(删除所有空格)。

现在,我的代码将采用上面的一个选项(因此,*U等)并返回正确的结果。我想要的是s应该返回一个函数,它将字符串转换为大写,排序并删除所有空格。

我无法弄清楚如何修改我的功能以适应多种选择。

stringPipeline("Us*")

我尝试使用def stringPipeline(Option:String) = (str:String) => { val UpperCase = () => str.toUpperCase val LowerCase = () => str.toLowerCase val titleCase = () => str.split(' ').map(_.capitalize).mkString(" ") val reverse = () => str.reverse val sortChars = () => str.sorted val replaceChar = () => str.replaceAll("\\s","") Option match { case "U" => UpperCase() case "l" => LowerCase() case "T" => titleCase() case "r" => reverse() case "s" => sortChars() case "*" => replaceChar() } } 运算符(没有工作),&&运算符(称为两个函数)并执行类似+的操作,这会产生编译器错误

2 个答案:

答案 0 :(得分:3)

您可以使用foldLeft使用一个单独的函数递归应用字符串上的所有运算符,该函数当时只有一个选项。

def stringPipeline(ops: String) = (str: String) => {
  def applyOp(str: String, op: String) = op match {
    case "U" => str.toUpperCase
    case "l" => str.toLowerCase
    case "T" => str.split(' ').map(_.capitalize).mkString(" ")
    case "r" => str.reverse
    case "s" => str.sorted
    case "*" => str.replaceAll("\\s","")
  }

  ops.split("").foldLeft(str)(applyOp)
}

使用字符串进行测试:

val str = stringPipeline("Us*")("age bfh dc")
println(str)

将给出预期的结果

ABCDEFGH

答案 1 :(得分:0)

另一种方法是生成复合函数。您可以尝试然后编写功能。例如:

scala> def inputStringPipeline(inputStr: String): String => String = {
     |     val upperCase = (input: String) => input.toUpperCase
     |     val lowerCase = (input: String) => input.toLowerCase
     |     val titleCase = (input: String) => input.split(' ').map(_.capitalize).mkString(" ")
     |     val reverse = (input: String) => input.reverse
     |     val sortChars = (input: String) => input.sorted
     |     val replaceChar = (input: String) => input.replaceAll("\\s", "")
     | 
     |     val emptyFunc: String => String = (input: String) => input
     |     inputStr.foldLeft(emptyFunc) {
     |       case (funcAcc, present) =>
     |         val newFunc = present.toString match {
     |           case "U" => upperCase
     |           case "l" => lowerCase
     |           case "T" => titleCase
     |           case "r" => reverse
     |           case "s" => sortChars
     |           case "*" => replaceChar
     |         }
     | 
     |         funcAcc andThen newFunc
     |     }
     | 
     | }
inputStringPipeline: (inputStr: String)String => String

scala> val input = "Us*"
input: String = Us*

scala> val func = inputStringPipeline(input)
func: String => String = scala.Function1$$Lambda$1061/1593722877@5ef7ae2f

scala> val str = func("age bfh dc")
str: String = ABCDEFGH

scala> println(str)
ABCDEFGH

这样就可以为给定的输入字符串操作生成一个新函数,并且可以与任意数量的字符串一起使用。这可以通过创建一次复合函数并再次使用它来节省时间。