缩进线(意外行为)

时间:2013-01-28 01:09:27

标签: ruby indentation

我想编写一行递归缩进的代码。我只是在研究一种使用全局制表变量的方法。所以我使用了以下代码:

@@tab = '  '
@@tab_add = '  '
@@nl = "\n"

def helper
    left = @@tab 
    right = @@tab
    @@tab = @@tab + @@tab_add
    str = '<hello>' + @@nl + left + helper2 + right + @@nl + '</hello>'
end 

def helper2
    left = @@tab 
    right = @@tab
    @@tab = @@tab + @@tab_add
    str = '<goodbye>' + @@nl + left + helper3 + right + @@nl + '</goodbye>' 
end 

def helper3
    str =  'dawg'
end

我知道,这不是最优雅的方式,但我只是在尝试。无论如何,当我输入

helper

我得到了

<hello>
   <goodbye>
     dawg
</goodbye>
</hello>

但为什么闭合的再见标签也不缩进?我将它保存为“帮助”功能中的“正确”局部变量。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您的helper2方法输出一个包含以下内容的字符串:

@@nl + '</goodbye>'

新行令牌和结束标记

之间不能有任何缩进

答案 1 :(得分:0)

你需要一个递归方法。

@@tab  = '  '
@@nl   = "\n"
indent = 0

def helper3
    str =  'dawg'
end

def indented(p_indent, p_string='')
    @@tab * p_indent + p_string
end

def write_indented(p_indent, p_array)
    return indented(p_indent, helper3) if p_array.empty?
    head, *tail = p_array
    indent = indented(p_indent)
    indent + '<' + head + '>' + @@nl + 
            # recursive call :
        write_indented(p_indent + 1, tail) +
        @@nl + indent + '</' + head + '>'
end

tags = %w[hello goodbye]
puts write_indented(indent, tags)

执行(ruby 1.8.6):

$ ruby -w t.rb 
<hello>
  <goodbye>
    dawg
  </goodbye>
</hello>

不幸的是,大多数时候通过阶乘或斐波纳契函数解释递归,这使得理解起来更加困难。
如果你通过一连串的调用表示递归,那实际上很简单:

write_indented(0, ['hello', 'goodbye'])
    ...
    call write_indented(1, ['goodbye'])
       |
       |
       +--> ...
            call write_indented(2, [])
               |
               |
               +--> return if stop condition
                        |
               +<-------+
       +<------+ return   
       |
  <----+ returned value
end