Scala - 如何创建带有和不带参数的函数的组合 ArrayList

Posted

技术标签:

【中文标题】Scala - 如何创建带有和不带参数的函数的组合 ArrayList【英文标题】:Scala - How to create a combine ArrayList of functions with and without parameters 【发布时间】:2021-04-09 08:30:25 【问题描述】:

假设我必须遵循:

def f1: Int ( or  def f1(): Int )
def f2 (x: Int): Int
def f3 (x: Int): Int
def f4: Int
...
...

注意:这里的'Int'只是一个例子

我想做......

class Container[T] 
  val values = mutable.ListBuffer.empty[T => Int]
  def addValue(value: T => Int) = values += v
  def doSome(t: T): Int = values.foldLeft[Int](0) (complete, v) => complete + v(t) 


val ContainerWithParam = new Container[Int]
val ContainerWithoutParam = new Container[???]

ContainerWithParam.addValue(f2)
ContainerWithoutParam.addValue(f1)

val result = ContainerWithParam.doSome(1000) + ContainerWithoutParam.doSome(???)

一种解决方案是使用 Option[Nothing]

class Container[T] 
  val values = mutable.ListBuffer.empty[T => Int]
  def addValue(value: T => Int) = values += v
  def doSome(t: T): Int = values.foldLeft[Int](0) (complete, v) => complete + v(t) 


def f1(nothing: Option[Nothing]): Int
val ContainerWithoutParam = new Container[Option[Nothing]]
ContainerWithoutParam.doSome(None)

但我认为这不是一个非常干净和漂亮的代码......

【问题讨论】:

【参考方案1】:

如果def f1: Int = ??? 那么...

val containerWithParam = new Container[Int]
val containerWithoutParam = new Container[Unit]

containerWithParam.addValue(f2)
containerWithoutParam.addValue(_ => f1)

val result = containerWithParam.doSome(1000) +
             containerWithoutParam.doSome(())

如果def f1(): Int = ??? 那么.addValue(_ => f1())

【讨论】:

您可以使用Function.const(f1()) 代替_ => f1()。这主要是口味问题,但我觉得它更干净一些。【参考方案2】:

@jwvh 的答案是正确的,但作为替代方案,您可以为函数没有参数的情况创建一个单独的类。这可以重用原来的实现。

class ContainerNoParam 
  private val container = new Container[Unit];
  def addValue(value: => Int): Unit = container.addValue(_ => value)
  def doSome(): Int = container.doSome(())


val ContainerWithParam = new Container[Int]
val ContainerWithoutParam = new ContainerNoParam

ContainerWithParam.addValue(f2)
ContainerWithoutParam.addValue(f1)

val result = ContainerWithParam.doSome(1000) + ContainerWithoutParam.doSome()

【讨论】:

以上是关于Scala - 如何创建带有和不带参数的函数的组合 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

js中new创建对象时带括号和不带括号有啥区别

没有参数的 Scala 方法

JavaScript 函数调用时带括号和不带括号的区别

Android Compose MVVM - 如何在不带参数的可组合函数中引用 viewModel 对象?

带有'var'和不带'var'的javascript全局变量[重复]

装饰器的应用-装饰器带参数和不带参数