标签: case-class

Scala的案例类和类之间有什么区别?

我在谷歌搜索找到a case class和a 之间的差异class.每个人都提到当你想在类上进行模式匹配时,使用用例类.否则使用类并提及一些额外的额外津贴,如equals和hash code overriding.但这些是为什么应该使用案例类而不是类的唯一原因?

我想在Scala中这个功能应该有一些非常重要的原因.有什么解释或者是否有资源可以从中了解有关Scala案例类的更多信息?

functional-programming scala case-class

424
推荐指数
10
解决办法
11万
查看次数

案例对象与Scala中的枚举

是否有关于何时使用案例类(或案例对象)与在Scala中扩展Enumeration的最佳实践指南?

他们似乎提供了一些相同的好处.

enumeration scala case-class

225
推荐指数
9
解决办法
11万
查看次数

IntelliJ Scala Plugin的案例类缩进是荒谬的

当一个case类有很多字段并且它们的名字很长时,通常最好在每行中写下每个字段,如:

case class Person (
  name: String,
  age: Int
)
Run Code Online (Sandbox Code Playgroud)

这类似于C/C++ struct定义,即使案例类变大,也完全可读.但IntelliJ IDEA的默认Scala插件会自动更改其缩进:

case class Person (
                    name: String,
                    age: Int
                    )
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,但Scala风格指南没有提到任何关于案例类缩进的内容.

我在IDE设置中找不到任何可以改变此行为的内容.是否有一个选项可以使自动缩进像我上面描述的那样工作或禁用案例类的自动缩进?

scala indentation intellij-idea case-class

136
推荐指数
1
解决办法
1万
查看次数

更新嵌套结构的更清洁方法

说我有以下两个case classes:

case class Address(street: String, city: String, state: String, zipCode: Int)
case class Person(firstName: String, lastName: String, address: Address)
Run Code Online (Sandbox Code Playgroud)

和以下Person类的实例:

val raj = Person("Raj", "Shekhar", Address("M Gandhi Marg", 
                                           "Mumbai", 
                                           "Maharashtra", 
                                           411342))
Run Code Online (Sandbox Code Playgroud)

现在,如果我想更新zipCode,raj那么我将不得不做:

val updatedRaj = raj.copy(address = raj.address.copy(zipCode = raj.address.zipCode + 1))
Run Code Online (Sandbox Code Playgroud)

随着嵌套水平的提高,这将变得更加丑陋.是否有更清洁的方式(像Clojure的东西update-in)来更新这样的嵌套结构?

scala zipper case-class

122
推荐指数
7
解决办法
2万
查看次数

简单的惯用方法来定义简单案例类的订购

我有一个简单的scala案例类实例列表,我想用可预测的字典顺序打印它们list.sorted,但是接收"没有为......定义的隐式排序".

是否存在为案例类提供词典排序的隐式?

是否有简单的惯用方法将词典排序组合成案例类?

scala> case class A(tag:String, load:Int)
scala> val l = List(A("words",50),A("article",2),A("lines",7))

scala> l.sorted.foreach(println)
<console>:11: error: No implicit Ordering defined for A.
          l.sorted.foreach(println)
            ^
Run Code Online (Sandbox Code Playgroud)

我对'黑客'不满意:

scala> l.map(_.toString).sorted.foreach(println)
A(article,2)
A(lines,7)
A(words,50)
Run Code Online (Sandbox Code Playgroud)

sorting scala case-class

104
推荐指数
6
解决办法
6万
查看次数

声明Scala案例类有哪些缺点?

如果您正在编写使用大量漂亮,不可变数据结构的代码,则案例类似乎是天赐之物,只需一个关键字即可免费为您提供以下所有内容:

  • 默认情况下一切都是不可变的
  • Getters自动定义
  • Decent toString()实现
  • 兼容的equals()和hashCode()
  • Companion对象使用unapply()方法进行匹配

但是将不可变数据结构定义为案例类有什么缺点?

它对班级或其客户有什么限制?

您是否应该选择非案例类?

scala case-class

103
推荐指数
4
解决办法
2万
查看次数

Scala的Case Classes的重载构造函数?

在Scala 2.8中是否有一种方法来重载案例类的构造函数?

如果是的话,请把一个片段解释一下,如果没有,请解释原因?

constructor scala overloading case-class scala-2.8

99
推荐指数
2
解决办法
6万
查看次数

Scala案例类继承

我有一个基于Squeryl的应用程序.我将我的模型定义为案例类,主要是因为我觉得有方便的复制方法.

我有两个严格相关的模型.字段相同,许多操作是共同的,它们将存储在同一个DB表中.但是有一些行为只在两种情况中的一种情况下才有意义,或者在两种情况下都有意义但有所不同.

到目前为止,我只使用了一个案例类,其中一个标志区分了模型的类型,所有基于模型类型的方法都以if开头.这很烦人,不太安全.

我想要做的是考虑祖先案例类中的常见行为和字段,并让两个实际模型继承它.但是,据我所知,继承自case类在Scala中是不受欢迎的,如果子类本身就是一个case类(不是我的情况),它甚至被禁止.

在继承案例类时我应该注意哪些问题和陷阱?在我的情况下这样做是否有意义?

inheritance scala case-class

84
推荐指数
4
解决办法
9万
查看次数

如何覆盖案例类伴随中的应用

所以情况就是这样.我想像这样定义一个case类:

case class A(val s: String)
Run Code Online (Sandbox Code Playgroud)

我想定义一个对象,以确保在创建类的实例时,'s'的值始终为大写,如下所示:

object A {
  def apply(s: String) = new A(s.toUpperCase)
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为Scala抱怨apply(s:String)方法定义了两次.我理解case类语法会自动为我定义它,但是我不能用另一种方法来实现它吗?我想坚持使用case类,因为我想将它用于模式匹配.

scala pattern-matching case-class

81
推荐指数
5
解决办法
4万
查看次数

要在Scala中映射的案例类

有没有一种很好的方法可以转换Scala case class实例,例如

case class MyClass(param1: String, param2: String)
val x = MyClass("hello", "world")
Run Code Online (Sandbox Code Playgroud)

进入某种映射,例如

getCCParams(x) returns "param1" -> "hello", "param2" -> "world"
Run Code Online (Sandbox Code Playgroud)

适用于任何案例类,而不仅仅是预定义的类.我发现你可以通过编写一个询问底层Product类的方法来拉出case类名,例如

def getCCName(caseobj: Product) = caseobj.productPrefix 
getCCName(x) returns "MyClass"
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找类似的解决方案,但对于案例类字段.我想象一个解决方案可能不得不使用Java反射,但是如果案例类的底层实现发生变化,我讨厌在未来的Scala版本中编写一些内容.

目前我正在使用Scala服务器并使用案例类定义协议及其所有消息和异常,因为它们是如此美观,简洁的构造.但是,我需要将它们转换为Java映射,以通过消息传递层发送以供任何客户端实现使用.我当前的实现只是分别为每个案例类定义一个翻译,但是找到一个通用的解决方案会很好.

scala case-class

71
推荐指数
6
解决办法
4万
查看次数