问题标签 [case-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5889 浏览

scala - 通过网络使用 Akka 的 Scala 案例类与协议缓冲区

首先是一些上下文:我正在用 Scala 编写一个客户端/服务器游戏(类似第一人称射击游戏),其中客户端需要每秒向服务器发送几十次移动意图,服务器将实体状态发送回来,在也是实时的。在客户端(用于图形流动性)和服务器端都使用 JBullet 对这些实体进行物理模拟。每当客户端从服务器接收到更新时,它都会用服务器发送的状态替换其本地状态。当然,在给定时刻,同一台服务器上可能有许多客户端。简而言之,在这个应用程序中,通信经常发生,带有小数据包。

目前,我正在使用 Akka 的 actor 天真地通过网络将 Scala 案例类发送到服务器并返回。这是一个例子:

然后在客户端:

在服务器上:

其中 ent.state 返回一个 EntityState:

这一切都工作得很好,但正如您所见,有很多案例类,有时包含其他案例类,以及客户端和服务器上的一堆案例测试。

  • 如何减少数据包大小和序列化、反序列化和匹配的开销?
  • 使用 Protobuf 而不是案例类会从我的应用程序的数据包中减少脂肪吗?
  • 我是否在寻找改进此网络协议的错误位置?
0 投票
2 回答
1175 浏览

scala - 修复序列化下的案例对象身份/模式匹配

我有一个在会话中被序列化和反序列化的类,我需要对内部类执行模式匹配。我在内部类的身份方面遇到问题:

可以说,什么是一种优雅的方式来修复身份EmptyValue而不是“逃避路径依赖”。我有如下代码,当序列化发生时会中断:

也就是说,尽管编译器说我的匹配是详尽的,但在使用序列化时我得到了一个运行MatchError时(我有自定义代码可以写入/读取字节数组)。例如,我从树中调用Tree$EmptyValue$@4636并检索 aTree$EmptyValue$@3601并且它们不匹配。

编辑

我进行了进一步的测试,因为我真的很想避免将内部类型移出,因为它们需要具有类型参数,从而破坏所有模式匹配代码。看起来好像问题只发生在那个特定的case object

0 投票
1 回答
1537 浏览

scala - 如何定义具有未绑定类型参数的成员的案例类?

给定具有绑定类型参数的类定义,Animal[A <: String]似乎 Scala 编译器不会B <: StringAnimal[B]. 允许推理吗?如何帮助编译器进行推理?

下面是一个案例类的具体示例,其中缺少这种推理是一个问题。

考虑以下案例类层次结构:

例如,我需要定义一个案例类University,我可以用一个类型的变量Person[_]对其进行实例化val p: Person[_] = Student()。我认为这将适用于以下定义:

但这无法编译并出现错误:

University如果我绑定它编译的案例类的类型参数(如果我删除case关键字,它也会使用无界参数进行编译,但在我的情况下这不是一个选项):

但是这个参数化版本不能用类型的无界变量实例化Person[_]

编译失败:

具有绑定参数的方法会发生相同的错误,例如:

所以这不是特定于类构造函数。

两个问题:

  1. 该类型Person是用参数 bounds 定义的Person[+T <: Person[T]],因此该类型的每个实例都可以确保遵守这些界限:val p: Person[P]暗示P <: Person[P]; 还是我错过了什么?那么我怎样才能让编译器明白这一点,这样它就不会抱怨呢?

  2. 如何/我可以定义一个带有未绑定类型参数的成员的案例类,例如case class University(p: Person[_])

0 投票
3 回答
2767 浏览

scala - 声明一个接受未知案例类作为参数的方法,以便在 Scala 的模式匹配中使用它

想象一个抽象类 A,它有一组案例类。我们不知道有多少集合类,甚至不知道这些案例类的名称。

现在我有这个:

我想通过参数将案例类类型传递给方法。我想要这个的原因是因为我将在一个文件中配置一组规则。我想加载这些规则并使用模式匹配这些规则提供的一些信息。我想做这样的事情:

这可能吗?

如果不是那么容易,我可以在模式匹配中使用抽象类吗?如果我可以简单地使用抽象类,那将是完美的,因为它具有所有案例类的主要结构。

编辑:

忘了提到案例类可以有不同的参数,所以最好使用基于类 A 的东西(因为我只能用字段进行模式匹配)

0 投票
1 回答
2468 浏览

scala - 获取包含在另一个对象中的对象中定义的案例类的字段名称

我有两个案例类定义如下

我想像这样获取他们实例的字段名称:

这对对象按预期工作outer,但对inner. 这是输出:

我看到的唯一区别是类InnerCase是在一个对象中定义的,它本身在另一个对象中定义,而OuterCase只包含在一个对象中。

为什么会有问题?为什么我可以得到 case 对象的参数名称outer而不是innercase 对象?

我在 Scala 2.9.2 中观察到了这种行为。

谢谢!

一些附加说明

我注意到使用scala或使用 sbt 从命令行运行相同的编译类是不同的。

从命令行:

但是使用 sbt:

任何有关找出这里发生的事情的提示将不胜感激。

0 投票
3 回答
1963 浏览

scala - Scala:父类有没有办法访问仅由子类定义的方法?

我有两个从抽象基类继承的案例类。我想在抽象基类上定义一些方法,这些方法使用继承案例类上的复制方法(因此返回子类的实例。)有没有办法使用自我类型来做到这一点?

示例代码:

由于这个问题,我已经弄清楚了如何获得我想要的结果: How to use Scala's this typing, abstract types, etc. to implement a Self type? 但它涉及向 BaseClass 添加一个 makeCopy 方法,并在每个子案例类中调用 copy 来覆盖它,并且语法(尤其是对于 Self 类型)相当混乱。有没有办法用 Scala 的内置自键入来做到这一点?

0 投票
1 回答
601 浏览

scala - 是否可以从 scala 脚本中使用 scalap?

scalap用来读出一些案例类的字段名称(如本问题所述)。案例类和scalap用于分析它们的代码都已编译并放入类路径上的 jar 文件中。

现在我想运行一个使用此代码的脚本,所以我按照说明操作并想出了类似的东西

这不起作用:

java.lang.ClassCastException: scala.None$ 不能在 scala.tools.nsc.interpreter.ByteCode$.caseParamNamesForPath(ByteCode.scala:45) 在 scala.tools.nsc.interpreter.ProductCompletion.caseNames( ProductCompletion.scala:22)

但是,当我编译所有内容时,代码工作得很好。我尝试了其他scala选项,例如-savecompiled,但这没有帮助。这是一个错误,还是原则上不能工作?(如果是这样,有人可以解释为什么不这样做吗?正如我所说,要分析的案例类scalap是编译的。)

注意:我使用 Scala 2.9.1-1。

编辑

这是我本质上想要做的(提供一种创建案例类的多个实例的简单方法):

注意:我继续使用 Scala 2.9.2,错误保持不变(所以可能不是错误)。

0 投票
5 回答
11361 浏览

scala - 动态混合特征

有一个特质

如何实现一个方法,该方法接受任何案例类的实例并返回其副本并混合特征?

该方法的签名如下所示:

0 投票
1 回答
4013 浏览

scala - 案例类构造函数看似虚假的“不接受参数”错误

我有一个案例类,它的构造函数有几个参数,我定义了一个随附的类对象,该对象定义了一个替代构造函数,该构造函数采用一组不同的参数,如下所示:

我想在 a 中使用原始案例类构造函数foldRight

当我这样做时,我从编译器收到一条错误消息:“MyClass 不接受参数。” 如果我注释掉该部分val mc2 = ...,这个问题就会消失,但MyClass显然是在zero. 我觉得我一定错过了一些非常基本的东西,但我不知道它是什么。我尝试了几种解决方法,比如定义一个辅助方法或一个函数值作为 的第二个参数foldRight,但都没有帮助,这并不奇怪,因为我基本上是在随机摸索。

0 投票
3 回答
5241 浏览

scala - 需要层次结构时如何使用案例类?

我知道你不允许从案例类继承,但是当你真的需要时你会怎么做?我们在一个层次结构中有两个类,它们都包含许多字段,我们需要能够创建两者的实例。这是我的选择:

  • 如果我将超类设为普通类而不是案例类 - 我将失去所有案例类的优点,例如 toString、equals、hashCode 方法等。
  • 如果我把它作为一个案例类,我会打破不从案例类继承的规则。
  • 如果我在子类中使用组合 - 我必须编写很多方法并将它们重定向到另一个类 - 这将意味着大量工作并且会感觉非 Scalaish。

我该怎么办?这不是很普遍的问题吗?