gen: custom-write для классов Ракетки - PullRequest
0 голосов
/ 23 февраля 2019

Я ищу канонический способ указания пользовательских методов для вывода полей объекта Racket.Другими словами, я ищу Racket-эквивалент метода Java toString (если он существует).

Я знаю, что для структур можно использовать gen:custom-write для указания функции write-proc ( source ).Есть ли что-то похожее для классов?

1 Ответ

0 голосов
/ 23 февраля 2019

Да для custom-write.Поскольку gen:custom-write является обёрткой вокруг prop:custom-write, возможно, что класс реализует это через интерфейс.

printable<%>Интерфейс реализует prop:custom-write, чтобы разрешать такие вещи:

#lang racket

(define fish%
  (class* object% (printable<%>)
    (super-new)
    (define/public (custom-print out depth)
      (fprintf out "><,`>"))
    (define/public (custom-write out)
      (fprintf out "><,`>"))
    (define/public (custom-display out)
      (fprintf out "><,`>"))))

Используя его:

> (new fish%)
><,`>

Это возможно, потому что *Интерфейс 1023 * использует форму interface* для наследования от свойства struct-type prop:custom-write.Однако это не относится ко всем универсальным интерфейсам, только к тем, которые соответствуют свойствам struct-type-properties.

PS Не стоит слишком беспокоиться о документации, в которой говорится, что prop:custom-write isосуждается.«Пользователям» не обязательно использовать его, поскольку для структур существует gen:custom-write, а для классов printable<%>.Он устарел как интерфейс, но как реализация не уходит.Таким образом, «безопасно» использовать, не беспокоясь.

...