给定一个字母(字符串),比如"a",我想将其转换为相应的控制代码,即"\ca" -或等效(在交替语法中)- "\C-a"、?\ca、"\x01"、"\u0001"。
我希望有一些“好的”,干净的方式来做这个转换,但我不明白。
显而易见的第一次尝试可能是尝试这样的方法:
def convert_to_control_code(letter)
"\c#{letter}"
end...But不起作用,因为它总是返回"\u0003{letter}" (其中"\u0003"是控制代码"\c#" )。
我目前的解决方案是通过执行以下操作来“暴力”它:
def convert_to_control_code(letter)
(0..255).detect { |x| x.chr =~ Regexp.new("\\c#{char}") }.chr
end然而,我不禁觉得有一种“正确”的方式来做这件事!
编辑:
这是我想出的另一个非暴力的解决方案,看起来很有效:
def convert_to_control_code(letter)
(letter.ord % 32).chr
end这看起来好多了,但也很烦人!
发布于 2015-01-17 14:49:34
你可以把它写成:
def convert_to_control_code(letter)
eval "?\\C-#{letter.chr}"
end
convert_to_control_code(97) # => "\u0001"
convert_to_control_code(98) # => "\u0002"发布于 2015-01-17 16:59:48
一种可能是和Ruby本身一样。它看起来可能是这样的:
def convert_to_control(letter)
letter = letter.chr # ensure we are only dealing with a single char
return 0177.chr if letter == '?'
raise 'an error' unless letter.ascii_only? # or do something else
(letter.ord & 0x9f).chr
end您可能希望根据正在执行的操作更改结果的编码。
https://stackoverflow.com/questions/28000339
复制相似问题