Scala:使用具有相同名称的函数和内部对象

时间:2018-06-22 03:26:12

标签: scala

为了方便我的用户,我想设计一个如下界面:

class MyApplication {
  def help = "usage..."

  object help {
    def topics : List[String] = List( ... )
  }
}

但是,当然,函数和名为help的对象的冲突使这不可能。

在Scala中有什么方法可以做到这一点?例如,如果用户呼叫help而没有任何跟随,则有一种行为,而如果呼叫help.topics则具有另一种行为?

(如果没有,做类似事情的惯用 Scala 方法是什么?)

2 个答案:

答案 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)