【问题标题】:Renaming classOf in Scala在 Scala 中重命名 classOf
【发布时间】:2011-09-11 12:57:36
【问题描述】:

我正在为 ScalaTest 开发客户可读的 DSL。现在我可以写了

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

但是这样读起来会好很多

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

有什么办法

def the[T] = 

返回classOf[T] ?

【问题讨论】:

    标签: scala dsl


    【解决方案1】:

    你可以试试这个:

    def the[T: ClassManifest]: Class[T] =
      classManifest[T].erasure.asInstanceOf[Class[T]]
    

    符号[T: ClassManifest] 是一个context bound,相当于:

    def the[T](implicit classManifest: ClassManifest[T])
    

    Manifest[T]ClassManifest[T] 的隐式值由编译器自动填充(如果它可以具体化传递给方法的类型参数)并为您提供有关 T 的运行时信息:ClassManifest 只给出将其擦除为Class[_]Manifest 还可以通知您T 本身可能的参数化(例如,如果TOption[String],那么您也可以了解String 部分) .

    【讨论】:

    • 谢谢 - 我已经尝试过了,它有效!我不知道它做了什么——我已经从 Java 大鲨鱼变成了 Scala 小鱼;-)
    • @Duncan 我添加了关于上下文边界和清单的简短说明。
    • 你是个绅士——还有更多 Scala'y 好消化。自从我买了 Coplien 的 C++ 书后,我就没有这么热衷了
    【解决方案2】:

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

    import Predef.{ classOf => the, _ }
    

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

    import Predef.classOf;
    

    有关重命名的更多信息,另请参阅:

    【讨论】:

    • 很好,但这取决于您图书馆的客户编写正确的导入。
    • 那么您也必须导入自己的 the 实现,不是吗?
    • 是的,像import mylib._ 这样简单,不需要额外的import Predef.{ classOf => the, _ }
    • 是的,但是告诉您的用户“只需导入 xxx._”和“导入 xxx._ 和 Predef.{ classOf => the, _ } 以及如果您仍然需要 Predef 之间存在很大差异.classOf'
    • @x3ro 关于自动包导入的要点。我问了一个类似的问题here,由于缺乏答案,我得出的结论是,当时(2.9)这种事情是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多