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中测试的非常基本的例子吗?我会接受你的回答