为什么我的scala代码有些错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的scala代码有些错误?相关的知识,希望对你有一定的参考价值。

cir.moveTo之后不应该变成Circle center:Point(30.0,20.0),R=5.0吗,咋还是Circle center:Point(10.0,10.0),R=5.0

参考技术A

你的Circle类派生自Shape,用变量center去初始化point变量,只在第一次初始化进行了值传递,以后你再改变时改变的是point,和center没有关系。你可以尝试打印point就可以看出它确实被改变了

如果你要覆盖Shape的定义,试试在Circle中使用,而不要又换名字又没有override

override var point:Point

追问

那我应该如何将point的值赋给center呢

追答

不要总想着定义变量,你是用继承和多态,首先你必须确保基类和派生类对象的合理性
首先说Shape,它的point变量到底是代表什么含义呢?不同派生类对这个point变量你的计划如何使用呢?当然这是留给你的思考题
其次:center不一定是一个var,它完全可以是一个def
再次:在构造函数里的var 是很不合理的,似乎在构造函数内用val给成员变量赋值即可,如
class Shape(val pointV:Point)
var point = pointV;
public def moveTo(val pointV: Point) :Unit =
point = pointV;


case class Circle(val pointV:Point, val radiusV:Double) extends Shape(pointV)
def center:Point =
return point;

var radius = radiusV;

带有 Play2.4 和 scala 的 Google Guice 的循环依赖错误

【中文标题】带有 Play2.4 和 scala 的 Google Guice 的循环依赖错误【英文标题】:Circular Dependency Error for Google Guice with Play2.4 and scala 【发布时间】:2015-06-30 13:33:33 【问题描述】:

我的应用程序使用 Play 2.4 和 Scala 2.11。我开始转换现有代码以使用 Play 2.4 附带的 Google Guice

在进行第一组更改后运行我的代码时,我发现我的代码中的一些 DAO 因 循环依赖错误而失败。

例如我有两个 DAO

class BookDAO @Inject()
(protected val personDAO : PersonDAO,
 @NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] 
...
...
val personId = //some id
personDAO.get(personId)


class PersonDAO @Inject()
(protected val bookDAO : BookDAO,
 @NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] 
...
...
val bookName= //some id
personDAO.getByName(bookName)

我在尝试访问 BookDAO 或 PersonDAO 时遇到以下错误

Tried proxying schema.BookDAO to support a circular dependency, but it is not an interface.
  at schema.BookDAO.class(Books.scala:52)
  while locating schema.BookDAO

谁能帮我解决这个错误。

提前致谢

【问题讨论】:

【参考方案1】:

快速解决方案

改为注入Provider

class BookDAO @Inject()(personDaoProvider: Provider[PersonDAO], ...)
extends HasDatabaseConfigProvider[JdbcProfile] 
  val personDAO = personDaoProvider.get
  def person = personDAO.get(personId)

BookDAO 也是如此。这将开箱即用。 Guice 已经“知道”如何注入 Providers。


更好的方法

将类定义与实现分离。请参阅 Mon Calamari 的回答。

【讨论】:

【参考方案2】:

如下定义你的依赖,并从类中提取所有需要的方法到特征:

@ImplementedBy(classOf[BookDao])
trait IBookDao 
  // abstract defs


class BookDao @Inject()(protected val personDAO: IPersonDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IBookDao 


@ImplementedBy(classOf[PersonDao])
trait IPersonDao 
  // abstract defs


class PersonDao @Inject()(protected val bookDAO: IBookDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IPersonDao 

如您所见,每个dao 都实现了一个特征,所有dao 依赖项都由trait 注入。这使Guice 可以注入代理类并解决循环依赖问题。

更多关于playframework scala依赖注入here的细节。

【讨论】:

以上是关于为什么我的scala代码有些错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用构造函数scala上的模式匹配键入不匹配

无法弄清楚为什么我的部分复制命令有效,有些则不然

在scala中过滤字符串列表的函数

为什么Scala是可扩展的?

Scala 运算符 #> 导致编译错误,但不是 &> - 为啥?

为啥我的 scala 期货效率不高?