所以情况就是这样.我想像这样定义一个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类,因为我想将它用于模式匹配.
当你创建一个类的情况下,编译器创建了几个案例类东西的相应配套对象:一个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) 我有一个元组
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应用程序中有一个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
我怎样才能使它工作?谢谢
假设我们有以下案例类:
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)
这是如何运作的?
我有一些代码
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)