我们可以有一个由名称参数函数组成的数组吗?

Jus12

在Scala中,我们有一个by-name-parameters,我们可以在其中编写

def foo[T](f: => T):T = {
   f // invokes f    
}
// use as:
foo(println("hello"))

我现在想对一组方法进行相同的处理,也就是说,我想将它们用作:

def foo[T](f:Array[ => T]):T = {     // does not work
   f(0) // invokes f(0)              // does not work
}
foo(println("hi"), println("hello")) // does not work

有什么办法可以做我想要的吗?我想出的最好的是:

def foo[T](f:() => T *):T = {
   f(0)() // invokes f(0)    
}
// use as:
foo(() => println("hi"), () => println("hello"))

或者

def foo[T](f:Array[() => T]):T = { 
   f(0)() // invokes f(0)    
}
// use as: 
foo(Array(() => println("hi"), () => println("hello")))

编辑:提议的SIP-24并不是非常有用,正如Seth Tisue在对此答案的评论中指出的那样

实用程序功能的以下代码是一个有问题的示例trycatch

type unitToT[T] = ()=>T
def trycatch[T](list:unitToT[T] *):T = list.size match {
  case i if i > 1 => 
    try list.head()
    catch { case t:Any => trycatch(list.tail: _*) }
  case 1 => list(0)()
  case _ => throw new Exception("call list must be non-empty")
}

此处trycatch获取类型的方法列表,()=>T并依次应用每个元素,直到成功或到达末尾为止。

现在假设我有两种方法:

def getYahooRate(currencyA:String, currencyB:String):Double = ???

def getGoogleRate(currencyA:String, currencyB:String):Double = ???

将一个单位转换currencyAcurrencyB并输出Double

trycatch用作:

val usdEuroRate = trycatch(() => getYahooRate("USD", "EUR"), 
                           () => getGoogleRate("USD", "EUR"))

我本来希望:

val usdEuroRate = trycatch(getYahooRate("USD", "EUR"), 
                           getGoogleRate("USD", "EUR")) // does not work

在上面的示例中,我getGoogleRate("USD", "EUR")只想在getYahooRate("USD", "EUR")引发异常时被调用这不是SIP-24的预期行为。

肖恩·维埃拉(Sean Vieira)

从Scala 2.11.7开始,答案是否定的。但是,这里有SIP-24,因此在某些将来的f: => T*版本中,可能会使用您的版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以有一个由名称参数函数组成的数组吗?

来自分类Dev

我们如何在yml中创建一个由2个属性组成的数组?

来自分类Dev

我们可以在ocaml中定义一个参数为0的函数吗?

来自分类Dev

我们可以在WSO2ESB中设置一个数组吗?

来自分类Dev

我们可以使用数组的最后一个元素吗?

来自分类Dev

没有最后一个参数的函数组成

来自分类Dev

我们可以定义两个具有相同名称但参数不同的函数吗?

来自分类Dev

由未咖喱的函数组成一个函数

来自分类Dev

我们可以在多个数组上使用一个 Array.filter() 方法吗?

来自分类Dev

在QT中,我们可以有两个名称相同但参数不同的插槽吗?

来自分类Dev

我们有超过一千个变量,但是我们不能计数那么多变量,所以Python中有一个函数可以说出我们有多少个变量吗?

来自分类Dev

我们可以从同一函数返回指向新静态数组的指针吗?

来自分类Dev

我们可以在C中与变量一起声明一个函数吗?

来自分类Dev

我们可以一次对两个不同的数组使用foreach()吗?

来自分类Dev

我们可以用C ++返回一个函数吗?

来自分类Dev

我们可以从另一个函数调用OnCreate()方法吗

来自分类Dev

jQuery我们可以循环一个函数吗?

来自分类Dev

我们可以训练一个模型作为平方函数吗

来自分类Dev

我们可以在Java中有一个AtomicEnum吗?

来自分类Dev

我们可以有一个空的基本路径吗?

来自分类Dev

我们可以有一个不在类型上但在操作上的模板吗

来自分类Dev

我们可以拥有一个以上的工人流程吗?

来自分类Dev

我们可以在 gitswarm 的一个项目下有多个存储库吗?

来自分类Dev

我们可以创建一个没有括号的对象吗?

来自分类Dev

如果我们有一个assoc数组,如何打印值

来自分类Dev

我们可以编写一个以元素为参数并返回结果的泛型方法吗?(例如返回 isDisplayed() 函数结果的方法)?

来自分类Dev

我们可以在Codeigniter控制器中创建两个具有相同名称的函数吗?

来自分类Dev

我们可以允许用户一次仅在SSRS中选择一个参数吗?

来自分类Dev

Matlab输入Ctrl + c后,我们可以执行一些代码或调用一个函数吗?

Related 相关文章

  1. 1

    我们可以有一个由名称参数函数组成的数组吗?

  2. 2

    我们如何在yml中创建一个由2个属性组成的数组?

  3. 3

    我们可以在ocaml中定义一个参数为0的函数吗?

  4. 4

    我们可以在WSO2ESB中设置一个数组吗?

  5. 5

    我们可以使用数组的最后一个元素吗?

  6. 6

    没有最后一个参数的函数组成

  7. 7

    我们可以定义两个具有相同名称但参数不同的函数吗?

  8. 8

    由未咖喱的函数组成一个函数

  9. 9

    我们可以在多个数组上使用一个 Array.filter() 方法吗?

  10. 10

    在QT中,我们可以有两个名称相同但参数不同的插槽吗?

  11. 11

    我们有超过一千个变量,但是我们不能计数那么多变量,所以Python中有一个函数可以说出我们有多少个变量吗?

  12. 12

    我们可以从同一函数返回指向新静态数组的指针吗?

  13. 13

    我们可以在C中与变量一起声明一个函数吗?

  14. 14

    我们可以一次对两个不同的数组使用foreach()吗?

  15. 15

    我们可以用C ++返回一个函数吗?

  16. 16

    我们可以从另一个函数调用OnCreate()方法吗

  17. 17

    jQuery我们可以循环一个函数吗?

  18. 18

    我们可以训练一个模型作为平方函数吗

  19. 19

    我们可以在Java中有一个AtomicEnum吗?

  20. 20

    我们可以有一个空的基本路径吗?

  21. 21

    我们可以有一个不在类型上但在操作上的模板吗

  22. 22

    我们可以拥有一个以上的工人流程吗?

  23. 23

    我们可以在 gitswarm 的一个项目下有多个存储库吗?

  24. 24

    我们可以创建一个没有括号的对象吗?

  25. 25

    如果我们有一个assoc数组,如何打印值

  26. 26

    我们可以编写一个以元素为参数并返回结果的泛型方法吗?(例如返回 isDisplayed() 函数结果的方法)?

  27. 27

    我们可以在Codeigniter控制器中创建两个具有相同名称的函数吗?

  28. 28

    我们可以允许用户一次仅在SSRS中选择一个参数吗?

  29. 29

    Matlab输入Ctrl + c后,我们可以执行一些代码或调用一个函数吗?

热门标签

归档