2016-09-09 4 views
0

, 나는이어떻게 파이썬에서

s = "Hello World" print(s.__dir__())

을 수행하여 하나의 개체의 가능한 회원을 표시 할 수 있습니다 스칼라 객체의 가능한 회원을 관찰 그리고 s는이 가능한 모든 구성원을 뱉어 것입니다. 스칼라에서이 작업을 수행하는 방법은 무엇입니까? 나는 구글과 문서를 검색하고, 아무것도 찾을 수 없습니다.

내가 사용하고있는 IDE가 탭 완성이 없기 때문에 내가 필요한 이유. __dir__()과 같은 것을 사용하여 가용성을 관찰하는 것이 중요합니다. 감사.

+0

[공공 장소 가져 오기] (http://stackoverflow.com/q/7457972/508064) – roterl

+0

나는 당신이 제공 한 링크를 시도했지만 예상했던 것을 얻지 못했습니다. 개체의 모든 속성과 메서드 (이 경우에는 문자열)를 원합니다. 링크가 도움이되는 이유를 자세히 설명해 주시겠습니까? –

+1

어떤 IDE를 사용하고 있으며 더 나은 IDE를 사용할 수없는 이유는 무엇입니까? (BTW, REPL에 탭 완성이 있습니다.) – jwvh

답변

0

에,이 파이썬보다 모두 더 힘들어 훨씬 간단 참조 할 수 있습니다.

이 때문에 암시 적 변환의, 훨씬 어렵습니다 : 예를 들어, 당신은 어느 쪽도 그 슈퍼 클래스의 String도 어떤이 -> 방법이 없습니다에도 불구하고 String-> 메서드를 호출 할 수 있습니다. 그러나이 이 (ArrowAssoc을라고도 함) -> 방법을 가지고있는 유형 Any에서 암시 적 변환이며, 스칼라 암시 ArrayAssoc 해당 개체를 변환하기 때문에 그래서, 어떤 개체의 -> 메소드를 호출하는 법률이다. 그래서 객체가 암시 적 변환이 범위 내에 있는지 알 수 없으므로 객체에 사용 가능한 메소드를 요청할 수 없습니다.

그러나 코드를 실제로 실행하지 않고도 사용 가능한 선택기 집합을 항상 정적으로 결정할 수 있기 때문에 훨씬 쉽습니다.

스칼라 REPL은 프리젠 테이션 컴파일러를 사용하여 구현을 구현하며 구현은 클래스 scala.tools.nsc.interpreter.resentationCompilerCompleter에 있습니다. 어쩌면 거기에서 영감을 얻을 수 있습니다. 일반적으로 올바른 접근법은 Scala Reflection 및/또는 Presentation Compiler를 사용하는 것입니다.

+0

감사! 이 답변은 올바른 방향으로 나를 가리키고 있습니다. –

0

Class 인스턴스에서 java 리플렉션을 사용할 수 있습니다.

예. 필드

s.getClass.getDeclaredFields 

를 얻을 수 이것은 당신에게 당신이 그렇게

scala> s.getClass.getDeclaredFields.mkString("\n") 
res3: String = 
private final char[] java.lang.String.value 
private int java.lang.String.hash 
private static final long java.lang.String.serialVersionUID 
private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields 
public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER 

Class이 개체를 instrospect 유사한 방법을 노출처럼 읽기 쉽게 만들 수있는 배열을 얻을 것이다.

당신은 스칼라에서 the docs

+1

이것은'+','##'과 같은 메소드가''RichString','->'에 대한 암시 적 변환에 의해 추가되는데''ArrayAssoc''에 암시 적 변환에 의해 추가됩니다. –

관련 문제