2011-11-08 4 views
0

동적 언어 런타임 (DLR) 개체를 문자열 표현으로 변환하는 일반적인 방법이 있습니까? 예를 들어, 다음 OBJ가 (이 경우, 파이썬) 특정 유형의 몇 가지 검사하는 예입니다 IronPython의 (C#에서 DLR 표현을 얻는 방법은 무엇입니까?

 if (obj is IronPython.Runtime.List) { 
      repr = ((IronPython.Runtime.List)obj).__repr__(
        IronPython.Runtime.DefaultContext.Default); 
     } else if (obj is IronPython.Runtime.PythonDictionary) { 
      repr = ((IronPython.Runtime.PythonDictionary)obj).__repr__(
        IronPython.Runtime.DefaultContext.Default); 

하지만 난 정말 그 자신의 언어로 OBJ의 표현을 좀하고 싶습니다, IronRuby 등)를 사용하고 각 유형별로 비교할 필요가 없습니다. obj.ToString()은 대부분의 객체를 잘 나타내지 않습니다.

+0

그럼 언어마다 하나의 표현을 얻을 수 있습니다 (__repr__이 존재한다면 to_s가 존재하고 그렇지 않으면 ToString). 그러나 구체적인 방법은 없습니다. 당신이 할 수있는 최선의 방법은 언어에 상응하는 "ToString"목록을 가지고 그것들 모두를 검사하는 것입니다. 그러나 각 객체 유형을 별도로 관리하는 것과 같이 필요하지는 않습니다. –

+0

IronPython 개체에서 작동합니다. 모두 C#에서 "__repr__"메서드가있는 것 같습니다. 그러나 IronRuby 개체에는 C# 수준에서 "to_s"메서드가있는 것으로 보이지 않습니다. –

+0

'Object' 클래스 (http://ruby-doc.org/core-1.9.3/Object.html#method-i-to_s)에있는 이유를 알 수 없습니다. 루비를 많이하지 않습니다. 파이썬이지만, 내가 아는 것은 모든 루비 객체가'to_s' 메소드를 노출해야한다는 것입니다. 또한'__repr__'과 동등한 것은'inspect' (http://ruby-doc.org/core-1.9.3/Object.html#method-inpectpect)이고'to_s '는 파이썬에서'__str__'과 같은 기능을합니다. –

답변

1

AFAIK, DLR 개체를 대표 문자열 표현으로 변환하는 일반적인 방법은 없습니다. 언어에 따라 다르며 불행히도 같은 방식으로 구현되지 않습니다.

적어도 IronPython을 사용하면 항상 Builtin 모듈에 대한 참조를 가져온 다음 개체에 str() (또는 repr()) 함수를 호출 할 수 있습니다.

var engine = Python.CreateEngine(); 
dynamic obj = engine.Execute("[1, 2, 3, 4, 5]"); 
dynamic builtin = engine.GetBuiltinModule(); 
string repr = builtin.str(obj); 

물론 스크립트 내에서 함수를 호출 할 수도 있습니다.

string repr = (string)engine.Execute("str([1, 2, 3, 4, 5])"); 

또 다른 옵션은 IronPython.Runtime.Operations 네임 스페이스에 정의 된 많은 작업 중 하나를 사용하는 것입니다.

string repr = IronPython.Runtime.Operations.PythonOps.ToString(obj); 

나는 아이언 루비를 잘 알고 아니에요하지만 일부 개체에 to_s()를 호출하면 때로는 작동하는 것 같다. 그렇지 않으면 실제로 to_s이없고 신뢰할 수없는 .NET 개체를 반환합니다. 나는 스크립트 내에서 그것을하는 것이 더 쉽다고 생각한다.

var engine = Ruby.CreateEngine(); 
string repr = (string)engine.Execute("[1, 2, 3, 4, 5].to_s"); 

사용할 수있는 다른 방법이 있는지 살펴볼 수 있습니다.

+0

제 문제 중 일부는 이러한 것들이 독립 실행 형 객체이고, 그들이 어떤 언어를 사용했는지 모르겠습니다. 이 작업은 언어 중립적 인 ScriptScope 공유를 통해 수행되지만 호스트 언어 (또는 일부 일반적인 표현)로 나타나는 것처럼 객체를 표시합니다. VirtualBlackFox의 제안을 사용하여 메서드 ___repr___ 메서드를 찾고 IronPython에서 작동하지만 IronRuby 메서드에서 아무 것도 찾을 수 없습니다. 앞으로의 DLR 언어에서도이 작업을 수행 할 방법이 없습니다. 아마도 모든 언어의 기본 객체에 ToRepr() 메소드를 추가해야합니다. –