복붙노트

[SCALA] 스칼라의 방법 목록을 얻는 방법

SCALA

스칼라의 방법 목록을 얻는 방법

(메소드의 이름은 단어 "인덱스"를 포함)의 문자열 클래스가 지원하는 당신이 할 수있는 인덱스 관련 방법 파이썬과 루비 같은 언어에서 언어를 물어

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

그리고 자바

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;  

어떻게 스칼라에서 같은 일을 할 것인가?

해결법

  1. ==============================

    1.아무도 더 직접적인 번역을 시도 없다고 호기심 :

    아무도 더 직접적인 번역을 시도 없다고 호기심 :

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

    그래서, 어떤 임의의 생각.

    그래서, 여기에 우리가 그것에 대해 할 수있는 작업은 다음과 같습니다

    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")
    
  2. ==============================

    2.당신은 스칼라 REPL 프롬프트를 사용할 수 있습니다. ""를 입력, 목록을 예를 들어 문자열 개체의 멤버 방법을 찾을 수 있습니다. (- 당신이 좋아하는 경우 다음 점 Tab 키를 눌러 다음으로, 또는 비 비어있는 빈 문자열이다) 한 다음 Tab 키를 누릅니다. REPL은 당신을 위해 모든 구성원 방법을 나열합니다.

    당신은 스칼라 REPL 프롬프트를 사용할 수 있습니다. ""를 입력, 목록을 예를 들어 문자열 개체의 멤버 방법을 찾을 수 있습니다. (- 당신이 좋아하는 경우 다음 점 Tab 키를 눌러 다음으로, 또는 비 비어있는 빈 문자열이다) 한 다음 Tab 키를 누릅니다. REPL은 당신을 위해 모든 구성원 방법을 나열합니다.

    이뿐만 아니라 다른 변수 유형에 적용됩니다.

  3. ==============================

    3.더 많은 이하 같은 방법 :

    더 많은 이하 같은 방법 :

    val names = classOf[String].getMethods.toSeq.
        filter(_.getName.toLowerCase().indexOf(“index”) != -1).
        map(_.getName).
        sort(((e1, e2) => (e1 compareTo e2) < 0))
    

    그러나 모든 한 줄에.

    좀 더 쉽게 읽을 수 있도록하기 위해,

    val names = for(val method <- classOf[String].getMethods.toSeq
        if(method.getName.toLowerCase().indexOf("index") != -1))
        yield { method.getName }
    val sorted = names.sort(((e1, e2) => (e1 compareTo e2) < 0))
    
  4. ==============================

    4.자, 잠깐.

    자, 잠깐.

    나는 자바 자세한 루비와 비교 예를 들어 인정.

    그러나 코드의 조각은 처음에 너무 장황하지 않았을 것이다.

    여기에 상응입니다 :

        Collection<String> mds = new TreeSet<String>();
        for( Method m : "".getClass().getMethods()) {
            if( m.getName().matches(".*index.*")){  mds.add( m.getName() ); }
        }
    

    어느 올바른로 표시 스칼라 버전과 문자의 거의 같은 수 있습니다

  5. ==============================

    5.내가 가진 이것은까지입니다 :

    내가 가진 이것은까지입니다 :

    "".getClass.getMethods.map(_.getName).filter( _.indexOf("in")>=0)  
    

    이 정렬 방법이없는 이상한 스칼라 배열입니다.

    편집하다

    이처럼 끝날 것입니다.

    "".getClass.getMethods.map(_.getName).toList.sort(_<_).filter(_.indexOf("index")>=0)
    
  6. ==============================

    6.스칼라 클래스가 여전히 JVM의 것들로 그냥 직접 자바 코드를 사용하여, 당신 대부분이 방식을 얻을 것이다. 당신 수 포트 스칼라 코드를 아주 쉽게뿐만 아니라,하지만, REPL에서 사용의 재미 / 연습 / 용이성.

    스칼라 클래스가 여전히 JVM의 것들로 그냥 직접 자바 코드를 사용하여, 당신 대부분이 방식을 얻을 것이다. 당신 수 포트 스칼라 코드를 아주 쉽게뿐만 아니라,하지만, REPL에서 사용의 재미 / 연습 / 용이성.

  7. from https://stackoverflow.com/questions/2886446/how-to-get-methods-list-in-scala by cc-by-sa and MIT license