如何使用 switch 运算符以及迭代字符串和检测符号的最佳方法
How to use switch operator and best way to iterate string and detect symbols
如何使用 switch
运算符而不是大 if/else
来实现此逻辑?
type token =
| DOT
| OPEN_BRACKET
| SYMBOL;
let dot_code = ".".[0] |> Char.code;
let open_bracket_code = "{".[0] |> Char.code;
let char_to_token symbol :token => {
let code = Char.code symbol;
let c =
if (code === dot_code) {
DOT
} else if (code === open_bracket_code) {
OPEN_BRACKET
} else {
SYMBOL
};
c
};
String.iter
(
fun symbol => {
let c = char_to_token symbol;
switch c {
| DOT => print_string " DOT "
| OPEN_BRACKET => print_string " OPEN_BRACKET "
| SYMBOL => print_char symbol
}
}
)
"a.s {";
或者迭代字符串并检测 .
和 {
等符号的最佳方法是什么?
首先,尝试 '.' |> Char.code
而不是 ".".[0] |> Char.code
。 Reason/OCaml 有字符文字。在这种情况下,由于它是单个管道,因此建议使用 Char.code '.'
。
其次,我个人也会在 char_to_token
中使用一个开关:
let char_to_token symbol :token =>
switch symbol {
| '.' => DOT
| '{' => OPEN_BRACKET
| _ => SYMBOL
};
这首先消除了对上述 let dot_code = ...
的需求。正如您可能已经猜到的那样,使用 switch
的好处是效率更高。请参阅编译为 js 的代码 here。本机编译也会发生同样的事情。
其他看起来不错!顺便说一句,既然你告诉我(不和谐)你刚刚开始 Reason,我会说这很简单并保持这种方式!当你变得更熟练时,我感觉你可能需要一个真正的解析器或者试试 GADT (http://mads-hartmann.com/ocaml/2015/01/05/gadt-ocaml.html).
如何使用 switch
运算符而不是大 if/else
来实现此逻辑?
type token =
| DOT
| OPEN_BRACKET
| SYMBOL;
let dot_code = ".".[0] |> Char.code;
let open_bracket_code = "{".[0] |> Char.code;
let char_to_token symbol :token => {
let code = Char.code symbol;
let c =
if (code === dot_code) {
DOT
} else if (code === open_bracket_code) {
OPEN_BRACKET
} else {
SYMBOL
};
c
};
String.iter
(
fun symbol => {
let c = char_to_token symbol;
switch c {
| DOT => print_string " DOT "
| OPEN_BRACKET => print_string " OPEN_BRACKET "
| SYMBOL => print_char symbol
}
}
)
"a.s {";
或者迭代字符串并检测 .
和 {
等符号的最佳方法是什么?
首先,尝试 '.' |> Char.code
而不是 ".".[0] |> Char.code
。 Reason/OCaml 有字符文字。在这种情况下,由于它是单个管道,因此建议使用 Char.code '.'
。
其次,我个人也会在 char_to_token
中使用一个开关:
let char_to_token symbol :token =>
switch symbol {
| '.' => DOT
| '{' => OPEN_BRACKET
| _ => SYMBOL
};
这首先消除了对上述 let dot_code = ...
的需求。正如您可能已经猜到的那样,使用 switch
的好处是效率更高。请参阅编译为 js 的代码 here。本机编译也会发生同样的事情。
其他看起来不错!顺便说一句,既然你告诉我(不和谐)你刚刚开始 Reason,我会说这很简单并保持这种方式!当你变得更熟练时,我感觉你可能需要一个真正的解析器或者试试 GADT (http://mads-hartmann.com/ocaml/2015/01/05/gadt-ocaml.html).