2013-05-07 6 views
1

Я попытался напечатать объект этого класса:стандарт (идиоматических) способ преобразования объекта в строку

define class <bill> (<object>) 
    slot num :: <string>; 
    slot ref :: <string>; 
end class <bill>; 

я могу сделать метод, как say

define method say (bill : <bill>) =>(); 
    format-out("num:%s\n", bill.num); 
    format-out("ref:%s\n", bill.ref); 
end method say; 

, но я хочу способ преобразовать объект <string>, который может быть использован как

format-out("%s\n", bill); 

or 

format-out("%s\n", as(<string>, bill)); 

or 

format-out("%=\n", bill); 

Я попытался

define method as(type == <string>, bill :: <bill>) 
    => (s :: <string>); 
    let result :: <stretchy-vector> = make(<stretchy-vector>); 
    add!(result, bill.num); 
    add!(result, bill.ref); 
    join(result, " "); 
end method as; 

но:

format-out("\%s\n", as(<string>,bill)); 

У меня был этот результат

Object {<bill>} cannot be converted to class {<class>: <string>} 
Object {<bill> 0x1ff8180} cannot be converted to class {class <string> 0x7f5d5c645c00} 
Breaking into debugger. 
Trace/breakpoint trap 

An с этим:

format-out("%s\n", bill); 

что результат:

{<bill> #x00000000025EF1B0} 

Что я делаю неправильно? Каков стандартный (идиоматический) способ печати объекта?

ответ

2

Идиоматический способ добавления поддержки для печати объекта, специализируясь на print-object. Но если вы хотите иметь возможность конвертировать представление объекта в строку, то, как вы это делали, специализация как универсальная. Он работает здесь, так что, может быть, есть ошибка где-то:

module: bill 

define class <bill> (<object>) 
    constant slot num :: <string>, init-keyword: num:; 
    constant slot ref :: <string>, init-keyword: ref: 
end class <bill>; 

define method as(type == <string>, bill :: <bill>) => (s :: <string>); 
    join(vector(bill.num, bill.ref), " "); 
end method as; 

format-out("%=\n", as(<string>, make(<bill>, num: "1", ref: "a"))); 

Результат:

$ bill 
"1 a" 
+0

Спасибо! Ошибка была в модуле импорта/экспорта – fraya