Ocaml 返回字符串而不是单位

Ocaml 返回字符串而不是单位,ocaml,Ocaml,我有一个课堂方法 method return__string_sCorona = let est_vide chaine_de_car = List.exists ((=) "") strg in let print_data name value = match nom with | [] -> () | _ -> if not (is_empty name) then print_string value e

我有一个课堂方法

  method return__string_sCorona =

    let est_vide chaine_de_car = List.exists ((=) "") strg in 
    let print_data name value = match nom  with 
      | [] -> ()
      | _ -> if not (is_empty name) then print_string value else () in

    begin
      print_data [self#get_province_state("Province or state: " ^ self#get_province_state ^ "\n");
      print_data [self#get_country_region] ("Country or region: " ^ self#get_country_region ^ "\n");
      print_data [self#get_last_update] ("Last Update: " ^ self#get_last_update ^ "\n");
      print_string("Lat et Long: " ^ string_of_float self#get_lat ^ " " ^ string_of_float self#get_long ^ "\n");
      print_string("Confirmed cases: " ^ string_of_int self#get_confirmed_cases ^ "\n");
      print_string("Death cases: " ^ string_of_int self#get_death_cases ^ "\n");
      print_string("Reestablished cases : " ^ string_of_int self#get_reestablished_cases ^ "\n");
      print_string("Active cases: " ^ string_of_int self#get_active_cases ^ "\n\n");
    end
这将打印关于新冠病毒-19的不同信息

实际上,该方法具有类型unit,但由于某些原因,我需要它返回字符串


与其只调用
my_object#return_string_sCorona
,我如何返回字符串并使用
print_string(my_object#return_string_sCorona)
打印结果?这一点很重要,因为我必须使用
labltk

在接口中使用它。将此添加到方法的开头

let buf = Buffer.create 512 in
. . .
将所有调用
print_string s
更改为
Buffer.add_string buf s

方法的结尾如下所示:

. . .
Buffer.add_string buf 
      ("Active cases: " ^ string_of_int self#get_active_cases ^ "\n\n");
Buffer.contents buf
end
更新

下面是一个使用缓冲区累积结果的示例函数。您应该能够以这种风格重写您的方法,而不会有太多麻烦

let show_intset x =
    let buf = Buffer.create 128 in
    let rec loop x n =
        if x <> 0 then
            begin
            if x mod 2 = 1 then
                begin
                if Buffer.contents buf <> "" then
                    Buffer.add_string buf ", ";
                Buffer.add_string buf (string_of_int n)
                end;
            loop (x / 2) (n + 1)
            end
    in
    loop x 0;
    Buffer.contents buf
让我们显示\u intset x=
设buf=Buffer.create 128英寸
让rec循环xn=
如果x 0那么
开始
如果x mod 2=1,则
开始
如果Buffer.contents buf“”,则
Buffer.add_字符串buf“,”;
Buffer.add_string buf(string_of_int n)
结束;
回路(x/2)(n+1)
结束
在里面
环x0;
Buffer.contents buf
下面是在顶层运行函数时的外观:

# #use "p.ml";;
val show_intset : int -> string = <fun>
# show_intset 12;;
- : string = "2, 3"
# show_intset 1023;;
- : string = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9"
# show_intset 1024;;
- : string = "10"
##使用“p.ml”;;
val show_intset:int->string=
#显示集合12;;
-:string=“2,3”
#show_intset 1023;;
-:string=“0、1、2、3、4、5、6、7、8、9”
#显示_intset 1024;;
-:string=“10”

我希望这有帮助。

我知道缓冲区,但我不能使用它。我必须删除所有打印**。如何设置多行字符串变量?可以将其设置为一个大字符串串联。这不是一个特别好的解决方案,因为它很可能会进行一些额外的复制,并且很难阅读。我理解,但它会使代码非常难看。Buffer类是返回多行字符串的替代方法,对吗?字符串中的行数一点也不有趣。但是,缓冲区是专门用来一次将字符串积累到几个子字符串中的。Buffer不是一个类,它是一个模块。你能做一个我可以在OCAMLShell中测试的非常基本的例子吗?我会接受你的回答