Любопытно, что никто не пробовал более прямой перевод:
""
.getClass.getMethods.map(_.getName) // methods
.sorted // sort
.filter(_ matches "(?i).*index.*") // grep /index/i
Итак, некоторые случайные мысли.
Разница между "методами" и обручами выше поразительна, но никто никогда не говорил, что отражение - это сила Java.
Я скрываю кое-что о sorted
выше: на самом деле он принимает неявный параметр типа Ordering
. Если бы я хотел отсортировать сами методы вместо их имен, я должен был бы предоставить это.
A 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")