2009-04-26 5 views
24

나는 전문가 F #의 좋은 덩어리를 읽고 실제 응용 프로그램을 만드는 중입니다. 디버깅하는 동안, 나는 REPL 창에서 일을 읽을 수 있도록 다음과 같이 FSI 명령을 전달에 익숙해 져했습니다printf를 사용하여 사용자 정의 유형의 출력을 사용자 정의하려면 어떻게합니까?

fsi.AddPrinter(fun (x : myType) -> myType.ToString()) 

내가의 printf 포맷 작업이 확장하고 싶은, 그래서 예를 들어, 입력 할 수 있습니다

printf "%A" instanceOfMyType 

출력을 사용자 정의 유형으로 제어하십시오. 이 책은이 작업을 수행 할 수 있음을 의미합니다 (93 페이지 "F # 웹 사이트에서 다루는 주제 인 사용자 정의 데이터 유형으로 작업 할 수 있도록 일반 구조 서식을 확장 할 수 있음"). 그러나 나는에 대한 참조를 찾지 못했습니다. 실제로 이것을 성취하는 방법. 아무도 어떻게 알 수 있습니까? 심지어 가능할까요?

편집 : 코드 샘플을 포함해야

, 그것이 내가 다루고있어 기록의 유형, 예를 들어,의

type myType = 
    {a: int}   
    override m.ToString() = "hello" 

let t = {a=5} 
printfn "%A" t 
printfn "%A" (box t) 

모두 인쇄 문 산출 :

{a = 5;} 

답변

34

는 예를 들어, StructuredFormatDisplay 속성을 사용하여 F # 2.0에서이 작업을 수행합니다 :

[<StructuredFormatDisplay("hello {a}")>] 
type myType = {a: int} 

을이 예에서는, 대신 기본 {a = 42;}, 당신은 hello 42을 얻을 것입니다.

이는 개체, 레코드 및 공용체 유형에 대해 동일한 방식으로 작동합니다.

  1. PropertyName는 모든 유형의 속성이 될 수 있습니다 패턴의 형식은 "PreText {PropertyName} PostText" (구실PostText 선택 사양 인)이어야 비록이 실제로 더 강력한 ToString() 때문에보다. 문자열이 아니라면 구조화 된 형식을 따릅니다. Don Syme's blog은 이러한 방식으로 트리를 재귀 적으로 포맷하는 예제를 제공합니다.

  2. 계산 된 속성 일 수 있습니다.그래서 당신이 실제로 비록 오히려 라운드에 대한 방법, 기록 및 노동 조합 유형에 대한 작업을 ToString()를 얻을 수 : 그런데

    [<StructuredFormatDisplay("{AsString}")>] 
    type myType = 
        {a: int} 
        override m.ToString() = "hello" 
        member m.AsString = m.ToString() // a property that calls a method 
    

, ToString() 항상 (심지어 기록 및 노동 조합 유형)이 사용됩니다 printfn "%A" 대신 printfn "%O"으로 전화하면됩니다.

+0

BTW, 그의 답변에 대한 후속 댓글에이 링크를 게시하는 것에 대해 @Brian에게 감사드립니다. 나는 방금 다른 사람이 찾아 오는 데있어 가치가 있다고 생각했습니다. –

4

는 흠 ... 나는 막연하게이 일부 변경을 기억하지만 전 또는 CTP (1.9.6.2) 이후에 일어난 경우 어떻게 잊어 버려. 어떤 경우

는 CTP에, 나는 VFSI 창에서 평가

type MyType() = 
    override this.ToString() = "hi" 
let x = new MyType() 
let xs = Array.create 25 x 
printfn "%A" x 
printfn "%A" xs 

내가 원하는 것이 무엇 않는 것을 볼, 그리고 그

x;; 
xs;; 

도 잘 인쇄합니다. 그래서, 이것이 원하는 것과 다른 점이 확실하지 않습니까?

+0

감사합니다. 원래 게시물에 대한 내 편집을보고, 멤버 함수가 추가 된 레코드 유형이며 클래스 유형과 다르게 작동합니다. – flatline

+1

@Brian, 네, 정상적으로 작동하지만 플랫 라인에서 말하듯이 union과 작동하지 않습니다. 및 레코드 유형. 나는 전에 잠시 만났습니다. http://cs.hubfs.net/forums/post/9163.aspx (어떤 followups도 얻지 못했을 때 fsbugs에 무엇인가 보냈는지 기억하지 못합니다, 미안) –

+0

도 참조하십시오. http://blogs.msdn.com/b/dsyme/archive/2010/01/08/some-tips-and-tricks-for-formatting-data-in-f-interactive-and-a-in-sprintf- printf-fprintf.aspx 및 http://msdn.microsoft.com/en-us/library/ee370334.aspx – Brian

-1

ToString 메서드를 재정의하는 경우 그렇게해야합니다. 그것은 올바른 방법처럼 보인다

관련 문제