gpt4 book ai didi

scala - 简单问题 - "Error: missing argument list for method"

转载 作者:行者123 更新时间:2023-12-04 15:39:46 25 4
gpt4 key购买 nike

我有一个简单的类和一个带有重载应用方法的伴随对象:

case class A(val s: String,
val x: Int,
val y: Int,
val z: Int,
val foo: Int => Int,
val l: Option[List[String]])

object A {
def apply(s: String, x: Int, y: Int, z: Int, foo: Int => Int) =
new A(s, x, y, z, foo, None)

def apply(s: String, x: Int, y: Int, z: Int, foo: Int => Int, l: List[String]) =
new A(s, x, y, z, foo, Some(l))
}

我们也定义一个函数:
def foo(x: Int): Int = x + 1

使用第一个构造函数有效:
scala> val a1 = A("a1", 1, 2, 3, foo)
a1: A = A(a1,1,2,3,$$Lambda$1842/2112068307@598e02f0,None)

但是使用第二个不会:
val a2 = A("a1", 1, 2, 3, foo, List("b1", "b2"))
<console>:24: error: missing argument list for method foo
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `foo _` or `foo(_)` instead of `foo`.
val a2 = A("a1", 1, 2, 3, foo, List("b1", "b2"))

问题:我需要通过的原因是什么 foo _foo(_)而不仅仅是像 a1 中的 foo例子?另外,我可以重新定义我的类,以便可以只使用 foo ?

最佳答案

我无法解释这一点。我的第一个想法是它与类型删除有关,如 slouc说,但后来我更仔细地查看了签名,即使在删除之后,它们也没有相同的类型签名:

案例类 apply :

String, Int, Int, Int, Function1, Option

伴侣对象 apply 1:
String, Int, Int, Int, Function1

伴侣对象 apply 2:
String, Int, Int, Int, Function1, List

所以,我不明白这怎么可能。

试图让它工作我注意到如果你重命名第二个 apply 它会正常工作其他方法:
scala> val a1 = A("a1", 1, 2, 3, foo)
a1: A = A(a1,1,2,3,$$Lambda$1286/1904652802@6b649efa,None)

scala> val a2 = A.apply2("a1", 1, 2, 3, foo, List("b1", "b2"))
a2: A = A(a1,1,2,3,$$Lambda$1287/866073173@2dd63e3,Some(List(b1, b2)))

或者同时定义 apply不在伴随对象中的方法:
object B {

def apply(s: String, x: Int, y: Int, z: Int, foo: Int => Int): A =
new A(s, x, y, z, foo, None)

def apply(s: String, x: Int, y: Int, z: Int, foo: Int => Int, l: List[String]): A =
new A(s, x, y, z, foo, Some(l))
}

回复:
scala> val a1 = B("a1", 1, 2, 3, foo)
a1: A = A(a1,1,2,3,$$Lambda$1351/814507488@50fa5938,None)

scala> val a2 = B("a1", 1, 2, 3, foo, List("b1", "b2"))
a2: A = A(a1,1,2,3,$$Lambda$1352/613231852@5d77be8e,Some(List(b1, b2)))

第三种方法,如 Robert Udah提到,定义 foo作为函数文字 (x: Int) => x + 1也解决了这个问题。但是,它不一定是 val , 可能是 def ,还有:
def foo = (x: Int) => x + 1

关于scala - 简单问题 - "Error: missing argument list for method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48320923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com