我正在写一个盲文转换器。我有这种方法来处理盲文字符的顶行:
def top(input)
braille = ""
@output_first = ""
@top.each do |k, v|
input.chars.map do |val|
if k.include?(val)
braille = val
braille = braille.gsub(val, v)
@output_first = @output_first + braille
end
end
end
@output_first
end
我正在为一个角色的中间和底部重复相同的each
循环。唯一与上述方法不同的是,@top
被替换为@mid
和@bottom
以对应于相应的行。
试图找到一种简化each
循环的方法,以便我可以在顶部,中间和底部线路上调用它。
答案 0 :(得分:2)
我不确定@top
var中的内容是什么,但我认为盲文的字符数量有限,因此我会考虑一些地图结构
BRAILLE_MAP = {
'a' => ['..',' .','. '], # just an example top,mid,bot line for character
'b' => ['..','..',' '],
# ... whole map
}
def lines(input)
top = '' # representation of each line
mid = ''
bot = ''
input.each_char do |c|
representation = BRAILLE_MAP[c]
next unless representation # handle invalid char
top << representation[0] # add representation to each line
mid << representation[1]
bot << representation[2]
end
[top,mid,bot] # return the lines
end
可能有更好的方法来处理这3个变量,但我现在想不到一个
答案 1 :(得分:2)
您可以将循环放在单独的方法中。
def top(input)
@output_first = handle_line(@top)
end
def handle_line(line)
result = ''
line.each do |k, v|
input.chars.map do |val|
if k.include?(val)
braille = val
braille = braille.gsub(val, v)
result = result + braille
end
end
end
result
end
然后,您可以在handle_line
和@mid
处理中调用@bottom