【问题标题】:How to find usages of a scala apply function in a class-instance in IntelliJ?如何在 IntelliJ 的类实例中查找 scala apply 函数的用法?
【发布时间】:2016-08-18 07:04:36
【问题描述】:

如果我从 Scala 类的实例调用 apply 方法

object Main {
  def main(args: Array[String]): Unit = {
    val a = new A(2)
    a(2)
    a(10)
  }

  class A(a: Int) {
    def apply(a: Int): A = new A(a)
  }
}

我无法通过 Alt + F7 或 Ctrl+click 找到它的用法。

有没有办法在 IntelliJ 中找到 scala apply 方法的用法?


编辑:在这个问题的第一个版本中,我不明白这只是类实例的应用方法的问题。它适用于伴随对象中的应用方法,如下面的@sebszyller 所示。

这可能是 IntelliJ 中的一个错误。结束问题。

【问题讨论】:

  • 我不确定你所说的 all 是什么意思,但是 Ctrl-Click 方法调用 Add10(13) 应该转到定义,或者如果单击定义应该显示用法.
  • 我的方法被称为 Add10(13),Ctrl-Click on apply 不显示用法。 “未找到任何用法。”
  • 不过对我有用。您使用的是什么版本的 IntelliJ?
  • 嗯,这很有趣。我们在团队中对此进行了讨论,但它对我们任何人都不起作用。我使用 2016.2.1。另外,如果使用 Add10.apply(13) 调用该方法,我会找到用法。
  • 嗯,你能告诉我一段代码应该在哪里找到用法吗?我会发布一个适合我的 sn-p。

标签: scala intellij-idea


【解决方案1】:

以下 sn-p 对我有用。

object Main {
  def main(args: Array[String]): Unit = {
    val a1 = A(1)
    val a2 = A(2)
  }

  class A(a: Int)
  object A {
    def apply(a: Int): A = new A(a)
  }
}

Ctrl-Click 给了我一个显示A(1)A(2) 的列表。很遗憾,目前无法显示屏幕截图。

也适用于您的示例;还给了我两个用法的列表。

object Main {
  def main(args: Array[String]): Unit = {   
    val eleven = Add10(1)
    val twelve = Add10(2)
  }

  object Add10 {
    def apply(a: Int): Int = a + 10
  }
}

我现在是 2016.2,但只要我记得,我就一直在使用该选项。

更新:

我想通了。考虑以下 sn-p:

object Main {
  def main(args: Array[String]): Unit = {
    val a = new A(2)
    val b = new A(10)

    val a1 = a(2)
    val a2 = a(2)
    a.doSthElse

    val b1 = b(10)
    val b2 = b(10)

    val apply1 = a.apply _
    val apply2 = b.apply _ 
    val apply3 = a.apply(10)

    val tenFromA = apply1(10)
    val tenFromB = apply2(10)


  }

  class A(a: Int) {
    def apply(a: Int): A = new A(a)

    def doSthElse = println("sth else")
  }
}

似乎apply 链接到类的实例而不是定义本身。在下面的 sn-p 中,如果您单击 a,它将向您显示所有用法:a(2) 两次,a.doSthElsea.apply _b 类似。我以a.apply _b.apply _a.apply(10) 的形式包含了三个显式调用。点击def apply 确实会显示这三种用法的列表。在我看来,它无法弄清楚 a(2) 是一个 apply 调用是一个错误。

【讨论】:

  • 感谢您帮助我解决这个问题。我上面的例子是直接写进 StackOverflow 的,没有经过测试。对此我深表歉意,因为当我尝试它时(以及您的 A(1)/A(2) 示例),它也适用于我。所以我回到我原来的一段代码,发现它实际上不是一个对象而是一个类。而且 IntelliJ 没有发现将 apply() 用于类的实例。将更新原始问题。
  • 很高兴我能帮上忙。只需将其标记为已关闭@ØyvindHolmstad,这样它就不会再出现在提要中了。
  • 问题没有解决。仍然找不到适用于 scala 类实例的 apply() 用法。会不会是 IntelliJ 错误?
  • 好吧,给我一个sn-p代码,这样我就可以尝试重现错误了。
  • 添加了一些额外的信息@ØyvindHolmstad
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2013-03-14
  • 2015-08-07
  • 2012-06-19
相关资源
最近更新 更多