相关疑难解决方法(0)

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

所以情况就是这样.我想像这样定义一个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万
查看次数

为什么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元组包装到自定义类对象

我有一个元组

val tuple = ("Mike", 40)
Run Code Online (Sandbox Code Playgroud)

和一个案例类

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

如何将我的元组打包到Person类的对象?除此之外有什么方法:

new Person(tuple._1, tuple._2)
Run Code Online (Sandbox Code Playgroud)

也许有人喜欢

tuple.asInstanceOf[Person]
Run Code Online (Sandbox Code Playgroud)

谢谢.

scala tuple-packing

16
推荐指数
1
解决办法
4144
查看次数

案例类中的静态函数(Scala)

我在Scala应用程序中有一个case类,并且我更喜欢在该类中编写静态函数,因为它最有意义.这是班级:

case class At (
    date : DateTime,
    id : String,
    location : Coordinate
)
{
...

   def getParsedValues(line : String) : At =
   {
      val mappedFields : Array[String] = Utils.splitFields(line)
      val atObject = new At(mappedFields)
      return atObject;
   }

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

然后从另一个Scala对象,我想将该方法getParsedValues()称为静态方法:

object Reader{
...
    var atObject = At.getParsedValues(line)
...
}
Run Code Online (Sandbox Code Playgroud)

但是它出错了 value getParsedEvent is not a member of object At

我怎样才能使它工作?谢谢

static-methods scala case-class

6
推荐指数
1
解决办法
4219
查看次数

案例类默认应用方法

假设我们有以下案例类:

case class CasePerson(firstName: String)
Run Code Online (Sandbox Code Playgroud)

我们还为它定义了一个伴侣对象:

object CasePerson {
 def apply() = new CasePerson( "XYZ" )
}
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的示例中,我使用apply方法显式定义了伴随对象,而没有定义默认的apply方法:

// This "default" apply has the same argument as the primary constructor of the case class
def apply(firstName : String) = new CasePerson(firstName)
Run Code Online (Sandbox Code Playgroud)

问:那么Scala在哪里获得"默认"适用?我在这里明确定义了伴随对象,没有默认的apply,编译器仍然知道如何执行:

val casePerson = CasePerson("PQR")
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

scala case-class

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

访问案例类的静态成员

我有一些代码

case class A(s:String) {val x = "hello"}
Run Code Online (Sandbox Code Playgroud)

为什么我不能在x没有实例化A类的情况下访问静态变量?如果我输入

A.x
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: value x is not a member of object A
Run Code Online (Sandbox Code Playgroud)

编辑:

我错过了提到剩下的代码.这是我想要使用的示例:

abstract class A { val name:String }
case class B(i:Int) extends A { val name = "B" }
case class C(b:Boolean) extends A { val name = "C" }
def getType(s:String) = s match {
  case B.name => println ("Object B")
  case C.name => println ("Object C")
}
Run Code Online (Sandbox Code Playgroud)

错误:

  scala> def getType(s:String) = s match …
Run Code Online (Sandbox Code Playgroud)

scala

0
推荐指数
1
解决办法
4046
查看次数