Scala Case类具有不同的参数类型

Scala Case类具有不同的参数类型,scala,Scala,我想写一个case类,它可以接受一个函数,该函数有一个或多个int作为它的参数。例如,这些将是有效的函数: def foo(x: Int): String = "foo" def bar(x: Int, y: Int): String = "bar" def foobar(x: Int, y: Int, z: Int): String = "foobar" 但这不会: def nonExample():String = "no" 问题是我无法为我的case类获取正确的参数类型 case cl

我想写一个case类,它可以接受一个函数,该函数有一个或多个int作为它的参数。例如,这些将是有效的函数:

def foo(x: Int): String = "foo"
def bar(x: Int, y: Int): String = "bar"
def foobar(x: Int, y: Int, z: Int): String = "foobar"
但这不会:

def nonExample():String = "no"
问题是我无法为我的case类获取正确的参数类型

case class Mine(function: ???) {}
我试过:

case class Mine(function: (Int*) => String)
这不起作用,因为(
Int*
)是一个
Int
序列。我也试过使用Function和Function1,但也不起作用。有什么想法(如果在Scala中不可能的话,还有其他选择)


Edit:正如Didier Dupont提到的,
Mine
还需要知道该方法需要多少参数。上面我把我的简化了。它还将使用另一个参数来说明传入的函数。在此基础上,它将决定传递多少个参数到函数中。但是除了那块代码,我的
中的所有其他东西都是一样的,不管函数是什么。

为什么不使用函数
数组[Int]=>字符串呢?vararg本质上是数组,所以它应该适合。

关于
(Int,Int*)=>字符串如何?您将收到第二个参数作为
Seq[Int]

我将推荐下一个解决方案(它有一些缺点,但通常可以满足您的需要)

和使用示例:

def foo(x: Int): String = "foo"
def bar(x: Int, y: Int): String = "bar"
def foobar(x: Int, y: Int, z: Int): String = "foobar"

val m1 = Mine(foo _)
println { m1.func(10) }              // output: "foo"

val m2 = Mine(bar _)
println { m2.func(10, 20) }          // output: "bar"

val m3 = Mine(foobar _) 
println { m3.func(10, 20, 30) }     // output: "foobar"

我的第一个想法是这是不可能的,但Scala总是让我感到惊讶<代码>功能1
功能2
等。。不要分享一个有用的共同特征,所以我非常怀疑它在没有魔法的情况下是否能工作。顺便说一句,方法不能传递,函数可以。那么你打算如何使用我的类呢?由于您不知道该方法需要多少参数,因此很难调用它。case类通常是值容器,实际上,最好的例子是
other
类型。它有
作为其可能的值,每个值只应包含一个值。模式匹配本身具有多个单参数版本的东西没有多大意义,因为它在擦除后看起来都一样。不幸的是,这不起作用。我在repl中尝试过,对于foo、bar和foobar,都存在类型不匹配。这是一个有趣的解决方案,Yury。其他感兴趣的人请注意:对于FuncRes,这就是实际将foo、bar和foobar传递到Mine的方式:val m1=Mine(FuncRes.func1(foo)),依此类推。
def foo(x: Int): String = "foo"
def bar(x: Int, y: Int): String = "bar"
def foobar(x: Int, y: Int, z: Int): String = "foobar"

val m1 = Mine(foo _)
println { m1.func(10) }              // output: "foo"

val m2 = Mine(bar _)
println { m2.func(10, 20) }          // output: "bar"

val m3 = Mine(foobar _) 
println { m3.func(10, 20, 30) }     // output: "foobar"