我从来没有从设计的解组和修饰名词中理解它(一个AddTwo类apply增加了两个!)的例子.
我理解它是语法糖,所以(我从上下文推断)它必须被设计为使一些代码更直观.
具有apply函数的类有什么意义?它用于什么,以及它使代码变得更好的目的(解组,修改名词等)?
在伴侣对象中使用时如何帮助?
试图弄清楚如何在类上重载括号.
我有这个代码:
class App(values: Map[String,String])
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我希望能够以这种方式访问值Map:
var a = new App(Map("1" -> "2"))
a("1") // same as a.values("1")
Run Code Online (Sandbox Code Playgroud)
这可能吗?
假设我在scala中有一个MyList类,列表作为私有成员.是否有可能为我的类定义"()"以在给出正索引的情况下返回预期的东西,并在负的情况下从结尾开始(就像在python中一样)?
如何从scala中的类型别名构造对象?
type MyType = List[Int]
println(List[Int]())
println(MyType()) // error: not found: value MyType
Run Code Online (Sandbox Code Playgroud)
这在必须返回该类型的新实例的函数中存在问题.基本示例:
def foo(x: MyType): MyType = {
if (x.head == 0) MyType() // Should Nil be used?
else if (x.head == -1) new MyType(1,2,3,4)
else x
}
Run Code Online (Sandbox Code Playgroud)
怎么会foo不知道实际的类型MyType?
trait MyFunctionTrait extends ((Int, Int) => Double)
class MyFunction1 extends MyFunctionTrait {
override def apply(a: Int, b: Int) => Double = a/b
}
object MyFunction2 extends MyFunctionTrait {
override def apply(a: Int, b: Int) => Double = a/b
}
Run Code Online (Sandbox Code Playgroud)
我不完全确定如何使用哪一个。区别是如何运行它们?
scala> val f = new MyFunction1
f: MyFunction1 = <function2>
scala> f(1,2)
res50: Double = 0.0
scala> MyFunction2(1,2)
res48: Double = 0.0
Run Code Online (Sandbox Code Playgroud)
我确实知道单例对象和类之间的区别是什么。我想知道在定义函数的特殊情况下的用例。文章中解释了函数,但我已经看到它被编程为一个类和一个对象,所以我想知道最佳实践是什么时候以及为什么。
在我的特定情况下,我想以柯里化风格将另一个函数作为函数的参数,然后MyFunction根据他们获得的函数来做略有不同的事情:如何编写柯里化 Scala 函数特征?
请回答1)一般情况,2)特殊情况。
PS:我试图将关于如何咖喱以及是类还是对象的问题分开 - 似乎不太好,就在这里。
我花了这么多时间在我的伴侣对象中组合一个工厂方法,如下所示:
class Stuff(val a: Int, val b: Long) { this() = this(0,0L) }
object Stuff {
def apply(a:Int, b:Int) = new Stuff(a, b.toLong)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我以为我杀了它时,我就去编译,这不起作用:
val widget = new Stuff(1,2)
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事!?我刚做完了!?救命!!!