在Scala中重命名classOf

Dun*_*gor 7 dsl scala

我正在为ScalaTest开发一个客户可读的DSL.目前我可以写

feature("Admin Login") {
  scenario("Correct username and password") {
    given("user visits", classOf[AdminHomePage])
    then(classOf[SignInPage], "is displayed")
Run Code Online (Sandbox Code Playgroud)

但这会更好看

feature("Admin Login") {
  scenario("Correct username and password") {
    given("user visits", the[AdminHomePage])
    then(the[SignInPage], "is displayed")
Run Code Online (Sandbox Code Playgroud)

有什么办法吗?

def the[T] = 
Run Code Online (Sandbox Code Playgroud)

回来classOf[T]

Jea*_*let 17

你可以试试这个:

def the[T: ClassManifest]: Class[T] =
  classManifest[T].erasure.asInstanceOf[Class[T]]
Run Code Online (Sandbox Code Playgroud)

符号[T: ClassManifest]是一个上下文绑定,相当于:

def the[T](implicit classManifest: ClassManifest[T])
Run Code Online (Sandbox Code Playgroud)

对于隐值Manifest[T]ClassManifest[T]由编译器自动填充(如果它可以具体化传递到方法的类型参数),给你的运行时间有关T:ClassManifest只给出了作为消失Class[_],并且Manifest还可以告诉你有关的可能的参数化T本身(例如,如果TOption[String],那么你也可以了解这String部分).

  • 谢谢 - 我试过了,它有效!我不知道它做了什么 - 我已经从一个大的Java鲨鱼变成一个Scala minnow ;-) (2认同)
  • 你是一个绅士 - 更多Scala'y善于消化.自从我购买了Coplien关于C++的书以来,我并没有这么热衷 (2认同)

fre*_*oma 3

您可能想要做的只是在导入时重命名该方法(在对象中定义Predef):

import Predef.{ classOf => the, _ }
Run Code Online (Sandbox Code Playgroud)

请注意,如果您像这样重命名它,则 classOf 将不再起作用。如果您仍然需要它,还需要添加此导入:

import Predef.classOf;
Run Code Online (Sandbox Code Playgroud)

有关更多重命名的好处,请参阅:

  • 是的,但是告诉你的用户“只导入 xxx._”和“导入 xxx._ 和 Predef.{ classOf => the, _ } 以及如果你仍然需要它 Predef.classOf”之间有很大的区别 (2认同)