问题标签 [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.
scala - 通过网络使用 Akka 的 Scala 案例类与协议缓冲区
首先是一些上下文:我正在用 Scala 编写一个客户端/服务器游戏(类似第一人称射击游戏),其中客户端需要每秒向服务器发送几十次移动意图,服务器将实体状态发送回来,在也是实时的。在客户端(用于图形流动性)和服务器端都使用 JBullet 对这些实体进行物理模拟。每当客户端从服务器接收到更新时,它都会用服务器发送的状态替换其本地状态。当然,在给定时刻,同一台服务器上可能有许多客户端。简而言之,在这个应用程序中,通信经常发生,带有小数据包。
目前,我正在使用 Akka 的 actor 天真地通过网络将 Scala 案例类发送到服务器并返回。这是一个例子:
然后在客户端:
在服务器上:
其中 ent.state 返回一个 EntityState:
这一切都工作得很好,但正如您所见,有很多案例类,有时包含其他案例类,以及客户端和服务器上的一堆案例测试。
- 如何减少数据包大小和序列化、反序列化和匹配的开销?
- 使用 Protobuf 而不是案例类会从我的应用程序的数据包中减少脂肪吗?
- 我是否在寻找改进此网络协议的错误位置?
scala - 修复序列化下的案例对象身份/模式匹配
我有一个在会话中被序列化和反序列化的类,我需要对内部类执行模式匹配。我在内部类的身份方面遇到问题:
可以说,什么是一种优雅的方式来修复身份EmptyValue
而不是“逃避路径依赖”。我有如下代码,当序列化发生时会中断:
也就是说,尽管编译器说我的匹配是详尽的,但在使用序列化时我得到了一个运行MatchError
时(我有自定义代码可以写入/读取字节数组)。例如,我从树中调用Tree$EmptyValue$@4636
并检索 aTree$EmptyValue$@3601
并且它们不匹配。
编辑
我进行了进一步的测试,因为我真的很想避免将内部类型移出,因为它们需要具有类型参数,从而破坏所有模式匹配代码。看起来好像问题只发生在那个特定的case object
:
scala - 如何定义具有未绑定类型参数的成员的案例类?
给定具有绑定类型参数的类定义,Animal[A <: String]
似乎 Scala 编译器不会B <: String
从Animal[B]
. 允许推理吗?如何帮助编译器进行推理?
下面是一个案例类的具体示例,其中缺少这种推理是一个问题。
考虑以下案例类层次结构:
例如,我需要定义一个案例类University
,我可以用一个类型的变量Person[_]
对其进行实例化val p: Person[_] = Student()
。我认为这将适用于以下定义:
但这无法编译并出现错误:
University
如果我绑定它编译的案例类的类型参数(如果我删除case
关键字,它也会使用无界参数进行编译,但在我的情况下这不是一个选项):
但是这个参数化版本不能用类型的无界变量实例化Person[_]
:
编译失败:
具有绑定参数的方法会发生相同的错误,例如:
所以这不是特定于类构造函数。
两个问题:
该类型
Person
是用参数 bounds 定义的Person[+T <: Person[T]]
,因此该类型的每个实例都可以确保遵守这些界限:val p: Person[P]
暗示P <: Person[P]
; 还是我错过了什么?那么我怎样才能让编译器明白这一点,这样它就不会抱怨呢?如何/我可以定义一个带有未绑定类型参数的成员的案例类,例如
case class University(p: Person[_])
?
scala - 声明一个接受未知案例类作为参数的方法,以便在 Scala 的模式匹配中使用它
想象一个抽象类 A,它有一组案例类。我们不知道有多少集合类,甚至不知道这些案例类的名称。
现在我有这个:
我想通过参数将案例类类型传递给方法。我想要这个的原因是因为我将在一个文件中配置一组规则。我想加载这些规则并使用模式匹配这些规则提供的一些信息。我想做这样的事情:
这可能吗?
如果不是那么容易,我可以在模式匹配中使用抽象类吗?如果我可以简单地使用抽象类,那将是完美的,因为它具有所有案例类的主要结构。
编辑:
忘了提到案例类可以有不同的参数,所以最好使用基于类 A 的东西(因为我只能用字段进行模式匹配)
scala - 获取包含在另一个对象中的对象中定义的案例类的字段名称
我有两个案例类定义如下
我想像这样获取他们实例的字段名称:
这对对象按预期工作outer
,但对inner
. 这是输出:
我看到的唯一区别是类InnerCase
是在一个对象中定义的,它本身在另一个对象中定义,而OuterCase
只包含在一个对象中。
为什么会有问题?为什么我可以得到 case 对象的参数名称outer
而不是inner
case 对象?
我在 Scala 2.9.2 中观察到了这种行为。
谢谢!
一些附加说明
我注意到使用scala
或使用 sbt 从命令行运行相同的编译类是不同的。
从命令行:
但是使用 sbt:
任何有关找出这里发生的事情的提示将不胜感激。
scala - Scala:父类有没有办法访问仅由子类定义的方法?
我有两个从抽象基类继承的案例类。我想在抽象基类上定义一些方法,这些方法使用继承案例类上的复制方法(因此返回子类的实例。)有没有办法使用自我类型来做到这一点?
示例代码:
由于这个问题,我已经弄清楚了如何获得我想要的结果: How to use Scala's this typing, abstract types, etc. to implement a Self type? 但它涉及向 BaseClass 添加一个 makeCopy 方法,并在每个子案例类中调用 copy 来覆盖它,并且语法(尤其是对于 Self 类型)相当混乱。有没有办法用 Scala 的内置自键入来做到这一点?
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,错误保持不变(所以可能不是错误)。
scala - 动态混合特征
有一个特质
如何实现一个方法,该方法接受任何案例类的实例并返回其副本并混合特征?
该方法的签名如下所示:
scala - 案例类构造函数看似虚假的“不接受参数”错误
我有一个案例类,它的构造函数有几个参数,我定义了一个随附的类对象,该对象定义了一个替代构造函数,该构造函数采用一组不同的参数,如下所示:
我想在 a 中使用原始案例类构造函数foldRight
:
当我这样做时,我从编译器收到一条错误消息:“MyClass 不接受参数。” 如果我注释掉该部分val mc2 = ...
,这个问题就会消失,但MyClass
显然是在zero
. 我觉得我一定错过了一些非常基本的东西,但我不知道它是什么。我尝试了几种解决方法,比如定义一个辅助方法或一个函数值作为 的第二个参数foldRight
,但都没有帮助,这并不奇怪,因为我基本上是在随机摸索。
scala - 需要层次结构时如何使用案例类?
我知道你不允许从案例类继承,但是当你真的需要时你会怎么做?我们在一个层次结构中有两个类,它们都包含许多字段,我们需要能够创建两者的实例。这是我的选择:
- 如果我将超类设为普通类而不是案例类 - 我将失去所有案例类的优点,例如 toString、equals、hashCode 方法等。
- 如果我把它作为一个案例类,我会打破不从案例类继承的规则。
- 如果我在子类中使用组合 - 我必须编写很多方法并将它们重定向到另一个类 - 这将意味着大量工作并且会感觉非 Scalaish。
我该怎么办?这不是很普遍的问题吗?