我正在学习嵌套,我的任务是使每条新行都以缩进开头。这是我的代码,但它不起作用
$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
您的代码有几个问题:
- 您正在使用全局变量,这通常是一个坏主意,请将其作为参数传递下去。为此,您可以使用
DSL
定义记录器和日志方法的类。
- 你正在打电话
puts
在块内,但您从未更改它的定义,我不明白您如何期望它打印缩进的字符串,它只会正常打印字符串而无需缩进。为此,您需要定义一个带有缩进打印的特殊方法,例如log
- 你正在打电话
rjust
期望它会缩进字符串。此方法有不同的目的 - 以指定的长度将字符串向右对齐(即向左填充)。如果字符串超过指定长度,则返回原始字符串。要实际缩进一个字符串,你应该这样做puts ' ' * nestingDepth + string
。乍一看很神奇,但*
运算符只是重复字符串,例如'abc' * 3 #=> 'abcabcabc'
总的来说,我会这样做:
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
Example:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)