【问题标题】:Value :: is not a member of type parameter [T] Scala?Value :: 不是类型参数 [T] Scala 的成员?
【发布时间】:2015-05-01 13:13:02
【问题描述】:

对于我必须创建的列表器类,它基本上只是一个带有一些额外方法的列表,我必须有一个交集方法。我认为我下面的内容有效,但在我标记问题行的部分,我不断收到“值 :: 不是类型参数 S 的成员”错误。什么会导致这种情况?第二部分只是奖金,但如果有人能说出为什么我标记的问题线二一直说对重载定义的模棱两可的引用,那就太好了。有两个构造函数,一个接受一个元素并启动列表,这是公共的,一个私有的主构造函数可以接受一个类型的列表并创建一个列表器。

def intersec(other:List[S]) = {
val a=this.toList
val b=other.toList
var holder = List()
var counter=b.length
if (b.length<a.length)cycles=a.length
for (i<-0 to cycles){
  if (a.contains(b(i))){
    holder=holder::b(i)       // problem line
  }
new Lister(holder)      // problem line 2
}}

【问题讨论】:

    标签: scala


    【解决方案1】:

    b(i) 有 S 型,当然 S 型没有前置功能。注意:: 是右结合的。所以holder :: b(i) 表示您正在使用参数holder 调用b(i):: 函数。

    所以您需要将该行更改为:holder = b(i) :: holder

    顺便说一句,您的代码是非常必要的,并且缺乏声明性。我认为您希望拥有一个行为与 Scala 标准库 intersect 函数不同的 intersect 函数。在这种情况下,您可以使用隐式类来扩展 List 以具有新功能。

    【讨论】:

    • 啊啊啊,我提交错了,c应该是持有人,虽然问题不是这个引起的。
    • 您必须以这种方式更改您的代码:holder = b(i) :: holder,原因我在上面解释过。
    • 您可以在this thread 中找到更多关于右关联方法的信息。简而言之,如果方法名称以冒号结尾,例如::,那么a :: b 是指b.::(a) 而不是a.::(b)。起初这令人困惑,但这是一个简洁的优雅想法。
    猜你喜欢
    • 2013-05-06
    • 2013-05-05
    • 2013-04-06
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多