将类似的循环简化为一个

时间:2017-05-14 22:48:50

标签: ruby enums

我正在写一个盲文转换器。我有这种方法来处理盲文字符的顶行:

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循环的方法,以便我可以在顶部,中间和底部线路上调用它。

2 个答案:

答案 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