我有以下代码:
class Animal(hair: Option[Hair])
class Cat(var hair: Option[Hair]) extends Animal(hair)
class Dog(var hair: Option[Hair]) extends Animal(hair)
class Sheep(var hair: Option[Hair]) extends Animal(hair)
//then somewhere else:
def what(animal: Animal) {
animal match {
case Cat(hair) => println("processing cat, hair=" + hair)
case Dog(hair) => println("processing dog, hair=" + hair)
case Sheep(hair) => {
println("processing sheep, cutting hair...")
hair = None
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:
1)当模式匹配与绵羊成功时,我怎样才能进入它的头发并改变它?它抱怨重新分配给val,然后我把它放在var构造函数中但仍然......
2)我能想到的另一种方法是将整个匹配值分配给变量,有没有办法将一些case类构造函数模式匹配的值绑定到变量?
(我知道我可能会在类似的东西上进行模式匹配s: Sheep然后调用,s.changeHairTo(None)但这是最不可取的方式).
在Scala IDE中,我收到有关我要编译的类的以下错误:
在对象MapArea中,方法addAnim的多个重载替代定义了默认参数.
是的,他们做到了!所以呢?我不明白这个哲学......
更新:
事实证明,可能存在编译器无法知道选择哪种方法的情况(正如Tomasz Nurkiewicz所指出的那样),我理解......但在我的情况下,可以清楚地区分这两种方法.这是确切的代码片段(这次保留了所有原始名称和内容):
def addAnim (name: String, x: Float, y: Float, tex: Buffer[Texture], fps: Int, percent: Float = 0): TImageSequence =
addAnim (name, x, y, tex(0).getImage.getWidth, tex(0).getImage.getHeight, tex, fps, percent)
def addAnim (name: String, x: Float, y: Float, w: Float, h: Float, tex: Buffer[Texture], fps: Int, percent: Float = 0): TImageSequence = {
// do stuff
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
trait A {
import org.somepackage.C._
}
class B extends A {
def getValue = value
^^^^^
}
object C {
var value = 5
}
Run Code Online (Sandbox Code Playgroud)
类中的值B是不可见的,这意味着类的固有导入A没有被继承B,尽管value内部完全可见A.如何实现继承导入的效果,以便我可以避免在特性A混合的多个类中显式导入相同的东西?
好的,这是另一个关于Casbah和MongoDB基础知识的问题.从数据库中检索DBObject后,如何从中提取某些数据?我知道有DBObject.get()方法,返回java.lang.Object.我是否必须这样做,然后将数据转换为所需的类型?我不确定这是最好的方法吗...任何人都可以建议如何更好地做到这一点?
更新:
最后,我采用了手动处理所有内容的方式.由于案例类限制,我不使用Salat,因为不建议将案例类用于生孩子,这需要架构重新安排.然而,答案被标记为最佳答案,因为它在大多数情况下都有效,而且这里没有其他更一般的答案.
我想基于Scala特性创建一个带有一些特殊属性的enity系统.
主要思想是:所有组件都是从共同特征继承的特征:
trait Component
trait ComponentA extends Component
Run Code Online (Sandbox Code Playgroud)
有时,如果是更复杂的层次结构和相互依赖的组件,它可以像这样:
trait ComponentN extends ComponentM {
self: ComponentX with ComponentY =>
var a = 1
var b = "hello"
}
Run Code Online (Sandbox Code Playgroud)
等等.我得出的结论是,Entity由于访问速度的原因,与每个组件相关的数据本身应该包含在内,而不是在一个或其他地方的某些存储器中.作为旁注 - 这也是为什么一切都是可变的,所以没有必要考虑不变性.
然后Entities创建,混合特征:
class Entity
class EntityANXY extends ComponentA
with ComponentN
with ComponentX
with ComponentY
Run Code Online (Sandbox Code Playgroud)
这里一切都很好,但我有一个特殊的要求,我不知道如何满足代码.要求是这样的:
每个特征必须提供有助于以通用形式收集特征相关数据的编码方法(?),例如以JSON Map等形式,Map("a" -> "1", "b" -> "hello")以及将这样的地图(如果接收的话)转换回来的解码方法.与性状有关的变量.另外:1)所有混合特征的所有编码和解码方法都是按照任意顺序通过Entity方法调用的encode,decode(Map)并且2)应该可以通过指定特征类型单独调用,或者更好,通过像字符串参数decode("component-n", Map).
不可能使用具有相同名称的方法,因为它们会因阴影或覆盖而丢失.我可以想到一个解决方案,其中所有方法都存储在Map[String, Map[String, String] => Unit]for decode中,并Map[String, () => Map[String, …
我正在使用Scala-IDE中的Eclipse中的一个简单项目.该项目使用其他人的库(源自*.java文件,而不是a .jar).库源文件在Japaneese中包含大量注释.我无法编译Scala项目,因为对于每个这样的文件,我都会收到类似这样的错误:
使用windows-1252解码D:\ path\FileName.java时出现IO错误请尝试使用-encoding选项指定另一个
好像我在项目使用Java时没有遇到这个问题.现在我正在迁移到Scala,这就是我得到的......我不想删除所有这些注释,有没有办法让编译器处理它们?我尝试了从文件编码参数开始Preferences->Resources->Text file encoding和结束的各种编码修复eclipse.ini...
我知道MongoDB中的对象可以包含多个级别的数据(就像JSON对象的方式一样).但是,Casbah驱动程序教程仅涵盖"平面"对象的创建,其中只有一个级别的数据.如何使用Casbah创建和处理多级对象?
在我的模板中,我想使用有界类型参数而不是确切类型:
@(myForm: Form[T])
Run Code Online (Sandbox Code Playgroud)
这里T就像是T <: MyType
以使其在使用中更通用.但是,我找不到指定这种行为的方法.我怎样才能做到这一点?
template-engine type-parameter playframework-2.0 playframework-2.1
我正在学习如何使用 Amazon 服务,特别是目前我想使用 Cloud Formation 脚本创建一个简单的设置:一个带有用 JS 编写的单个 lambda 的 VPC,该 VPC 可以访问同一 VPC 中的 Elasticsearch 服务。
不知怎的,我无法让它工作。从 lambda 到 Elasticsearch 域的所有请求始终会超时。但是,从同一 VPC 中运行 Amazon Linux 2 的 EC2 实例中的相同 JS 代码或curl(即使没有任何额外授权,只需卷曲 ES 域终端节点)发出的相同请求可以正常工作,并且我可以与 Elasticsearch 正常通信来自该 EC2 实例(通过 SSH 连接到其中)。
同时,lambda 能够访问 VPC 中的 Aurora 集群,因此 lambda 无法访问 VPC 资源并不是一般问题。
请告诉我我在 Cloud Formation 的设置描述中做错了什么?以下是我的 Cloud Formation 模板的相关摘录以及能够从 EC2 实例访问 ES 服务的 JS 代码示例,但无法对 lambda 执行相同的操作:
AWSTemplateFormatVersion: 2010-09-09
Description: The AWS CloudFormation tutorial
Resources:
SomeDeploymentBucket:
Type: 'AWS::S3::Bucket'
AppLogGroup:
Type: 'AWS::Logs::LogGroup'
Properties: …Run Code Online (Sandbox Code Playgroud) amazon-ec2 amazon-web-services elasticsearch aws-cloudformation amazon-vpc
我脑子里有以下课程:
abstract class MyClass (data: MyData) {
def update(): MyClass = {
new MyClass(process())
}
def process(): MyData = {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,无法实例化抽象类,因此该行new MyClass(process())是错误的.我的问题是 - 有没有办法告诉编译器,在MyClass的每个子类的情况下,我想创建一个完全该子类的对象?在所有子类中编写此方法awhole似乎有点过分.使用类或方法的类型参数我无法实现自己.
scala ×7
casbah ×2
mongodb ×2
amazon-ec2 ×1
amazon-vpc ×1
binding ×1
eclipse ×1
encoding ×1
import ×1
inheritance ×1
scala-ide ×1
traits ×1