【问题标题】:Scala: Accepting function name as user inputScala:接受函数名称作为用户输入
【发布时间】:2018-07-04 07:04:00
【问题描述】:

我们如何接受函数名作为用户输入?标准库中是否有任何成员,如 readLine、readByte 等可以解决此目的?

上下文:作为函数式编程的一部分,我需要将函数名作为第一个参数传递,但我希望接受它作为用户输入,而不是硬编码。

请提出建议。

这里是示例代码:

def square(x:Int):Int = x*x

def sum(f: Int => Int, a:Int, b:Int):Int ={
  if(a>b) 0 else f(a) + sum(f,a+1,b)
}

println("Enter the first number:")

var num1 = readInt()

println("Enter the second number:")

var num2 = readInt()

val ressum = sum(square,num1,num2)

【问题讨论】:

  • 传递函数名和传递函数本身有很大的不同。鉴于您的上下文是函数式编程实践,您确定您实际上并不想要后者吗?将函数名称作为字符串传递几乎不是惯用的 FP。
  • 你能解释一下你想要实现的目标吗?您是否希望用户输入函数名称,然后从您要执行该函数的代码中输入?
  • 参考我添加的示例代码
  • 可以使用反射来做到这一点,但反射确实应该被视为最后的手段,我强烈建议使用 jwvh 的方法,除非有一个非常非常强有力的理由不满意

标签: scala


【解决方案1】:

用户输入是String。函数和方法名称不是。要从一个到另一个,您必须测试输入内容。

val result = usrInput match {
  case "foo" => foo()
  case "bar" => bar()
  case "baz" => baz()
  case _ => throw new Error(s"I don't know $usrInput")
}

这假设它们都具有相同的返回类型(并且返回的值是感兴趣的)。如果它们返回不同的类型,那么代码会变得更加复杂。

if (usrInput == "foo") {
  val fooRslt = foo()
  // do more "foo" stuff
} else if (usrInput == "bar") {
  val barRslt = bar()
  // etc. etc.
...

编译器会检查函数和方法调用的类型安全性。用户输入是运行时内容。编译时,运行时,两者都不会相遇。

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2014-07-27
    • 2016-06-24
    相关资源
    最近更新 更多