2013-08-20 34 views

回答

3

为我匹配字符最简单的方法是这样的

fn match_char(data: &char) -> bool { 
    match *data { 
     '\x01'...'\x08' | 
     '\u{10FFFE}'...'\u{10FFFF}' => true, 
     _ => false, 
    } 
} 

模式相匹配的角色对我来说是最简单的途径,比起一堆if声明。它可能不是最高性能的解决方案,但它为我提供了很好的服务。

+0

性能应该和我的答案一样。就我个人而言,在这种情况下,我更喜欢我的技术(如果有非布尔输出或更多的可能性,我会使用匹配),但两者都可以。 –

+0

它对我来说是可读性。我有很多这些条件(意见不同 - 令人震惊),为了便于阅读,我要么选择匹配模式的路线,要么为了速度而使用'char - '\ x01'<= 7'来查看速度[aosabook-xml光(http://aosabook.org/en/posa/parsing-xml-at-the-speed-of-light.html) –

4

最简单的方法,假设他们是不是Unicode类别(在这种情况下,你应该使用std::unicode)是使用常规的比较操作:

(s >= '\x01' && s <= '\x08') || s == '\U0010FFFE' || s == '\U0010FFFF' 

(如果你不知道的这些东西的文字形式,一个得到8位十六进制文字\xXX,16位十六进制文字\uXXXX和32位十六进制文字\UXXXXXXXX。事实上,铸造也可以很好地工作,例如0x10FFFE as char,并且一样有效;不太容易阅读)。

+1

请注意,整数到字符的转换是不安全的,可能会消失:例如尽管它不是有效的代码点,但允许“0xFFFF_FFFF as char”。 (另外'std :: unicode'目前是私有的;(大部分)它的功能是通过'std :: char'和'std ::: str'来访问的。) – huon

相关问题