Don';我不理解Ruby ljust/rjust/center方法

Don';我不理解Ruby ljust/rjust/center方法,ruby,Ruby,我正在学习嵌套,我的任务是使每一行以缩进开始。这是我的代码,但它不起作用 $nestingDepth = 0 def logger description, &block puts "Beginning #{description}".rjust($nestingDepth) puts $nestingDepth $nestingDepth = $nestingDepth + 10 result = block.call $nestingDept

我正在学习嵌套,我的任务是使每一行以缩进开始。这是我的代码,但它不起作用

$nestingDepth = 0

def logger description, &block
    puts "Beginning #{description}".rjust($nestingDepth)
    puts $nestingDepth
    $nestingDepth = $nestingDepth + 10
    result = block.call
    $nestingDepth = $nestingDepth - 10
    puts $nestingDepth
    puts "End of #{description} block that returned #{result}".rjust($nestingDepth)
end

logger "first block" do 
    logger "second block" do
        logger "third block" do 
            puts "third block part"
        end
        puts "second block part"
    end
    puts "first block part"
end
您的问题是需要一个大于应用它的字符串长度的整数。您的字符串是:

"Beginning #{description}" 
这就变成了:

Beginning first block
Beginning second block
在大多数传球中,长度为21或22。
$nestingdepth
的最大值是20。当整数小于字符串长度时,它只返回不带填充的字符串。如果我以嵌套深度25开始脚本,您将看到它展开

                             Beginning first block
25
                                      Beginning second block
35
                                                 Beginning third block
45

您的代码有几个问题:

  • 您使用的是全局变量,这通常不是一个好主意,请将其作为参数传递。为此,可以使用定义记录器和日志方法的
    DSL
  • 您正在调用
    放入块中,但您从未更改它的定义,我看不出您希望它如何打印缩进字符串,它只会正常打印字符串而不缩进。为此,您需要定义一种使用缩进打印的特殊方法,例如
    log
  • 您正在调用
    rjust
    ,期望它缩进字符串。此方法有一个不同的用途-用指定的长度在字符串的右侧(即左填充)对其进行调整。如果字符串长于指定的长度,则返回原始字符串。要实际缩进字符串,您应该执行
    put'*nestingDepth+string
    。一开始看起来很神奇,但是
    *
    操作符只是重复字符串,例如
    'abc'*3#=>'abcabc'
总而言之,我会这样做:

class DSL
  def initialize
    @depth = 0
  end

  def logger(description, &block)
    log "Beginning #{description}"
    @depth += 1
    result = instance_eval(&block)
    @depth -= 1
    log "End of #{description} that returned #{result}"
  end

  def log(string)
    puts indent + string
  end

  private

  def indent
    ' ' * (10 * @depth)
  end
end

def logger(*args, &block)
  DSL.new.logger(*args, &block)
end
例如:

logger "first block" do 
  logger "second block" do
    logger "third block" do 
      log "third block part"
    end
    log "second block part"
  end
  log "first block part"
end
这张照片是:

Beginning first block
          Beginning second block
                    Beginning third block
                              third block part
                    End of third block that returned
                    second block part
          End of second block that returned
          first block part
End of first block that returned 

我假设你想对看跌期权进行缩进?这怎么不起作用?你以为会发生什么?您的
$nestingDepth
似乎减/加得很好?@JakobS是的,但输出粘贴在终端的左侧,只是没有indent@britishtea我希望第一块有缩进,第二块有一点,第三块有最大的缩进。然后,当块完成时,我希望缩进变小