【问题标题】:Calling methods in a companion object调用伴生对象中的方法
【发布时间】:2016-03-18 22:46:14
【问题描述】:

我是学习 Scala 的新手,并且正在阅读Scala 中的函数式编程一书。我在解决如何测试我的练习解决方案时遇到了一些概念和编程问题,这与如何正确调用伴随对象中定义的方法有关。

我有以下数据类型MyList,我在本书中定义了这些数据类型

sealed trait MyList[+A]
case object Nil extends MyList[Nothing]
case class Cons[+A](head: A, tail: MyList[A]) extends MyList[A]

object MyList {

    def apply[A](as: A*): MyList[A] = {
        if (as.isEmpty) Nil
        else Cons(as.head, apply(as.tail: _*))
    }

    def sum(ints: MyList[Int]): Int = ints match {
        case Nil => 0
        case Cons(x, xs) => x + sum(xs)
    }

    def product(ds: MyList[Double]): Double = ds match {
        case Nil => 1
        case Cons(x, xs) => x * product(xs)
    }

}

我想在伴生对象中测试我对 applysumproduct 方法的实现。为此,我在对象定义后的文件中添加了以下几行(这些行有效)

val x = MyList(1, 2, 3, 4)
println(x)

如果我运行这些(我是命令行类型的人,所以这是一个 bash shell 会话),它似乎可以按我的预期工作

$ scala ch3-list.scala
Cons(1,Cons(2,Cons(3,Cons(4,Nil))))

但我在使用其他两个功能时遇到了问题。我尝试了以下组合

println(x.sum())
println(sum(x))
println(x.sum(x))
println(x.sum)

他们都给我错误。例如,我认为最有可能工作的x.sum() 给出了

$ scala ch3-list.scala
/Users/matthewdrury/Projects/fp-in-scala/ch3-list.scala:28: error: value sum is not a member of this.MyList[Int]
println(x.sum())
          ^

我是 scala 新手,也没有 java 经验,所以范围规则对我来说仍然很模糊。我想知道我在这里在概念上缺少什么,并就设置测试此类进一步方法的最佳工作流程获得一些建议。

【问题讨论】:

  • import MyList._; println(sum(x))
  • @Kolmar 那会在 repl 中,还是要添加到 .scala 文件中的一行?
  • import MyList._ 行“放在”调用 sum 之前。在同一个函数中,同一个对象/类中,在文件的开头等等......在 REPL 中调用导入也可以。

标签: scala


【解决方案1】:

您正在寻找MyList.sum(x)

sum 方法在伴生对象中,未定义为 MyList 类的成员。

【讨论】:

  • 我真的应该想到这一点 :) 有没有更好的方法来进行设置?
  • 使它们成为MyList 的成员方法并打开this。但是,您会遇到更复杂的问题,因为在 MyList 内部您不知道 A 是什么(IntDouble、其他一些不可添加/可乘的类……)。你可以用generalized type constraints解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多