标签: case-class

为什么case类伴随对象扩展了FunctionN?

当你创建一个类的情况下,编译器创建了几个案例类东西的相应配套对象:一个apply工厂方法相匹配的主构造,equals,hashCode,和copy.

奇怪的是,这个生成的对象扩展了FunctionN.

scala> case class A(a: Int)                                 
defined class A

scala> A: (Int => A)
res0: (Int) => A = <function1>
Run Code Online (Sandbox Code Playgroud)

只有在以下情况下才会这样:

  • 没有手动定义的伴随对象
  • 只有一个参数列表
  • 没有类型参数
  • 案例类不是抽象的.

似乎这是大约两年前添加的.最新的化身就在这里.

有没有人使用它,或者知道它为什么被添加?它使用静态转发器方法稍微增加了生成的字节码的大小,并显示在#toString()伴随对象的方法中:

scala> case class A()
defined class A

scala> A.toString
res12: java.lang.String = <function0>
Run Code Online (Sandbox Code Playgroud)

UPDATE

使用单个apply方法手动创建的对象不会自动视为FunctionN:

object HasApply {
  def apply(a: Int) = 1
}
val i = HasApply(1)

// fails
//  HasApply: (Int => …
Run Code Online (Sandbox Code Playgroud)

scala case-class companion-object

38
推荐指数
4
解决办法
3135
查看次数

Scala:将JSON直接解析为案例类

给定一个JSON字符串,以及一个与之对应的case类,将JSON解析为case类的简单方法是什么?有许多库可用,但似乎Scala现在可以开箱即用.

如果应该将JSON解析为案例类的列表呢?

更新:

杰克逊似乎被抛弃了,我不想安装完整的Play或Lift框架或其他任何重型框架.

parsing json scala case-class scala-2.10

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

如何从Java"获取"Scala案例对象?

我在Scala中创建了一个case对象层次结构,如下所示:

package my.awesome.package

sealed abstract class PresetShapeType(val displayName: String)

case object AccelerationSensor extends PresetShapeType("Acceleration Sensor")
case object DisplacementSensor extends PresetShapeType("Displacement Sensor")
case object ForceSensor        extends PresetShapeType("Force Sensor")
case object PressureSensor     extends PresetShapeType("Pressure Sensor")
case object StrainSensor       extends PresetShapeType("Strain Sensor")
Run Code Online (Sandbox Code Playgroud)

我还有一段我想要访问的Java代码PressureSensor,但以下内容不起作用:

package my.awesome.package.subpackage;

import my.awesome.package.PressureSensor;

// Do some stuff, then...

DVShape newshape = DVShapeFactory.createPresetShape(PressureSensor, new Point3f(0,0,0));
Run Code Online (Sandbox Code Playgroud)

那么,我如何PressureSensor从Java 引用case对象?我反编译了PressureSensorPressureSensor$类的字节码,产生了以下内容:

Compiled from "DVShapeFactory.scala"
public final class org.nees.rpi.vis.PressureSensor extends java.lang.Object{
    public static final java.lang.Object productElement(int);
    public …
Run Code Online (Sandbox Code Playgroud)

scala case-class

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

Scala Macros:使用Scala中的类字段制作地图

假设我有很多类似的数据类.这是一个示例类User,定义如下:

case class User (name: String, age: Int, posts: List[String]) {
  val numPosts: Int = posts.length

  ...

  def foo = "bar"

  ...
}
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是自动创建一个方法(在编译时),Map该方法以在运行时调用每个字段名称时将其映射到其值的方式返回.对于上面的例子,让我们说我的方法被调用toMap:

val myUser = User("Foo", 25, List("Lorem", "Ipsum"))

myUser.toMap
Run Code Online (Sandbox Code Playgroud)

应该回来

Map("name" -> "Foo", "age" -> 25, "posts" -> List("Lorem", "Ipsum"), "numPosts" -> 2)
Run Code Online (Sandbox Code Playgroud)

你会如何用宏来做到这一点?

这就是我所做的:首先,我创建了一个Model类作为我所有数据类的超类,并在那里实现了这样的方法:

abstract class Model {
  def toMap[T]: Map[String, Any] = macro toMap_impl[T]
}

class User(...) extends Model {
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后我在一个单独的Macros对象中定义了一个宏实现: …

scala case-class scala-macros

33
推荐指数
2
解决办法
8762
查看次数

Scala case类私有构造函数但是public apply方法

如果我有以下具有私有构造函数的case类,并且我无法访问companion对象中的apply-method.

case class Meter private (m: Int)

val m = Meter(10) // constructor Meter in class Meter cannot be accessed...
Run Code Online (Sandbox Code Playgroud)

有没有办法将case类与私有构造函数一起使用,但是在公开的伴随中保留生成的apply-method?

我知道两个选项之间没有区别(在我的例子中):

val m1 = new Meter(10)
val m2 = Meter(10)
Run Code Online (Sandbox Code Playgroud)

但我想禁止第一种选择.

- 编辑 -

令人惊讶的是以下工作(但实际上并不是我想要的):

val x = Meter
val m3 = x(10) // m3  : Meter = Meter(10)
Run Code Online (Sandbox Code Playgroud)

scala apply private-constructor case-class

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

为什么参数处于逆变位置?

我试图在trait中使用covariant类型参数来构造一个case类,如下所示:

trait MyTrait[+T] {
  private case class MyClass(c: T)
}
Run Code Online (Sandbox Code Playgroud)

编译说:

error: covariant type T occurs in contravariant position in type T of value c
Run Code Online (Sandbox Code Playgroud)

然后我尝试了以下但它也没有用:

trait MyTrait[+T] {
  private case class MyClass[U <: T](c: U)
}
Run Code Online (Sandbox Code Playgroud)

这次的错误是:

error: covariant type T occurs in contravariant position in type >: Nothing <: T of type U
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么T在这里处于协变位置并建议解决这个问题吗?谢谢!

scala covariance contravariance case-class

31
推荐指数
2
解决办法
7090
查看次数

Scala 2.10反射,如何从案例类中提取字段值

如何使用scala 2.10中的新反射模型从scala中的case类中提取字段值?例如,使用下面的内容并没有提取字段方法

  def getMethods[T:TypeTag](t:T) =  typeOf[T].members.collect {
    case m:MethodSymbol => m
  }
Run Code Online (Sandbox Code Playgroud)

我打算把它们抽进去

  for {field <- fields} {
    currentMirror.reflect(caseClass).reflectField(field).get
  }
Run Code Online (Sandbox Code Playgroud)

reflection scala case-class scala-2.10

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

从Strings构造简单的Scala案例类,严格没有样板

我寻求简洁的代码来初始化Strings中的简单Scala案例类(例如csv行):

case class Person(name: String, age: Double)
case class Book(title: String, author: String, year: Int)
case class Country(name: String, population: Int, area: Double)

val amy = Creator.create[Person]("Amy,54.2")
val fred = Creator.create[Person]("Fred,23")
val hamlet = Creator.create[Book]("Hamlet,Shakespeare,1600")
val finland = Creator.create[Country]("Finland,4500000,338424")
Run Code Online (Sandbox Code Playgroud)

Creator这样做最简单的对象是什么?我会从Scala那里学到很多很好的解决方案.

(注意伴侣的对象Person,BookCountry不应被强迫存在.这将是锅炉板!)

constructor scala boilerplate case-class

29
推荐指数
1
解决办法
1390
查看次数

如何在Spark SQL中定义自定义类型的模式?

以下示例代码尝试将一些案例对象放入数据框中.代码包括案例对象层次结构的定义和使用此特征的案例类:

import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.SQLContext

sealed trait Some
case object AType extends Some
case object BType extends Some

case class Data( name : String, t: Some)

object Example {
  def main(args: Array[String]) : Unit = {
    val conf = new SparkConf()
      .setAppName( "Example" )
      .setMaster( "local[*]")

    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

    import sqlContext.implicits._

    val df = sc.parallelize( Seq( Data( "a", AType), Data( "b", BType) ), 4).toDF()
    df.show()
  }
}    
Run Code Online (Sandbox Code Playgroud)

执行代码时,我遗憾地遇到以下异常:

java.lang.UnsupportedOperationException: Schema for type …
Run Code Online (Sandbox Code Playgroud)

scala case-class apache-spark apache-spark-sql

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

Scala案例类更新值

我有一个包含2个String成员的case类.我想稍后更新第二个成员,所以首先我用String和None创建一个实例,然后我将数据加载到类中,并希望用某个值更新第二个成员.

我该怎么做?

scala option case-class

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