scala - 如何在Scala中获取方法列表

标签 scala

您可以使用python和ruby之类的语言询问该语言,其字符串类支持哪些与索引相关的方法(哪些方法的名称包含单词“index”),您可以这样做

“”.methods.sort.grep /index/i

在java中
List results = new ArrayList();  
Method[] methods = String.class.getMethods();  
for (int i = 0; i < methods.length; i++) {  
    Method m = methods[i];  
    if (m.getName().toLowerCase().indexOf(“index”) != -1) {  
        results.add(m.getName());  
    }  
}  
String[] names = (String[]) results.toArray();  
Arrays.sort(names);  
return names;  

您将如何在Scala中做同样的事情?

最佳答案

奇怪的是没有人尝试过更直接的翻译:

""
.getClass.getMethods.map(_.getName) // methods
.sorted                             // sort
.filter(_ matches "(?i).*index.*")  // grep /index/i

因此,有些随意的想法。
  • “方法”和上面的箍之间的区别是惊人的,但是没有人说反射是Java的强项。
  • 我在上面隐藏了有关sorted的内容:它实际上采用了Ordering类型的隐式参数。如果我想对方法本身而不是名称进行排序,则必须提供它。
  • grep实际上是filtermatches的组合。由于Java决定匹配整个字符串,即使未指定^$,它也变得有些复杂。我认为在grep上有一个Regex方法在某种意义上是以Traversable为参数的,但是...

  • 所以,这是我们可以做的:
    implicit def toMethods(obj: AnyRef) = new { 
      def methods = obj.getClass.getMethods.map(_.getName)
    }
    
    implicit def toGrep[T <% Traversable[String]](coll: T) = new {
      def grep(pattern: String) = coll filter (pattern.r.findFirstIn(_) != None)
      def grep(pattern: String, flags: String) = {
        val regex = ("(?"+flags+")"+pattern).r
        coll filter (regex.findFirstIn(_) != None)
      }
    }
    

    现在这是可能的:
    "".methods.sorted grep ("index", "i")
    

    关于scala - 如何在Scala中获取方法列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2886446/

    相关文章:

    scala - 两个库引入了相同依赖项的不同版本。如何导入它们?

    java - 混合 java/scala 项目的自动生成文档

    java - 将 Scala 选项转换为 Java 可选

    scala - 使用 FIRRTL 注释连接多位线和引脚

    scala - Spark /斯卡拉 : Passing RDD to Function

    scala - 如何禁用 IntelliJ IDEA 的类型检查?

    android - Scala 上使用最少 GC 的池化

    scala - 使用 classManifest 提供具有上限类型界限的 Class 对象

    scala - 如何使用隐式参数实现FRP?

    scala - 为什么 Scala 有这么多 Collection View 类型?