为了方便我的用户,我想设计一个如下界面:
class MyApplication {
def help = "usage..."
object help {
def topics : List[String] = List( ... )
}
}
但是,当然,函数和名为help
的对象的冲突使这不可能。
在Scala中有什么方法可以做到这一点?例如,如果用户呼叫help
而没有任何跟随,则有一种行为,而如果呼叫help.topics
则具有另一种行为?
(如果没有,做类似事情的惯用 Scala 方法是什么?)
答案 0 :(得分:4)
是的,如果将def help
内的apply
转换为object help
,则可以实现:
class MyApplication {
object help {
def topics : List[String] = List("a", "b")
def apply(): String = "usage..."
}
}
现在,它可以编译并且可以进行以下调用:
val myApp = new MyApplication()
myApp.help()
myApp.help.topics
但是,.help()
中仍然有括号可以使用,否则myApp.help
仍然是函数引用。
答案 1 :(得分:1)
不可能有一个类,其中.help
返回String
,而.help.topics
返回List[String]
。但是,这是使用助手类的应用程序的一个选项。如果您有一系列的类,每个类都有自己的帮助信息,则这将更适用。
abstract class Help {
val usage: String
val topics: List[String]
def apply() = usage
override def toString = usage
}
class MyApplication {
object help extends Help {
val usage = "usage"
val topics = List("Topic1", "Topic2")
}
}
val a = new MyApplication
println(a.help)
println(a.help())
println(a.help.topics)