您可以使用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
因此,有些随意的想法。
sorted
的内容:它实际上采用了Ordering
类型的隐式参数。如果我想对方法本身而不是名称进行排序,则必须提供它。 grep
实际上是filter
和matches
的组合。由于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/