我想在if else里面做几件事。 我读了一个字符串,然后检查它的长度。如果为3,则执行X;如果为4,则执行Y。
我尝试过:
let str = read_line ()
let first_approach () =
if String.lenght str = 3
then let char1 = String.get str 0
let char2 = String.get str 1
let char3 = String.get str 2
else ()
let second_approach () =
if String.lenght str = 3
then let char1 = String.get str 0
let char2 = String.get str 1
let char3 = String.get str 2
let char4 = String.get str 3
else ()
我想知道如何使然后中的所有东西正常工作。因为出现语法错误。 预先谢谢你。
答案 0 :(得分:1)
此代码存在很多问题。
在模块的最外层(例如,源文件或REPL输入),您可以使用let var = val
来定义全局变量。例如,在您的代码中,您正在使用此构造定义str
。
但是,每当let
出现在其他任何地方(在声明或表达式内)时,它都用于定义 local 变量,并且必须紧跟in
和表达式其中使用本地定义。由于您在in
和first_approach
的定义中没有second_approach
,因此您的代码在语法上无效。
由于first_approach
和second_approach
中的定义是局部的,因此调用它们后将无效。 char1
等的定义即使经过语法校正也不会是全局的。 (正如@melpomene所说,代码没有执行任何操作。)
如果您有多个用;
隔开的表达式,则可以使用begin
/ end
将它们分组为then
或else
之后的一个表达式。
let f x =
if x > 5 then
begin
Printf.printf "x is quite large\n";
Printf.printf "adios\n"
end
如果字符串s
的长度为3,则没有字符String.get s 3
。
# let s = "abc";;
val s : string = "abc"
# String.get s 3;;
Exception: Invalid_argument "index out of bounds".
答案 1 :(得分:0)
您可以使用在一个let中分配多个变量。
let (a, b, c) = (1, 2, 3)
或使用您的字符串示例:
let (char1, char2, char3, char4_opt) =
if String.lenght str = 3
then (str.[0], str.[1], str.[2], None)
else (str.[0], str.[1], str.[2], Some str.[3])
注意:我将char4_opt与选项类型一起使用,因为长度为3的字符串没有内容可放在其中。