gpt4 book ai didi

ruby - ruby 中 "#{}"字符串的惰性求值

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:03 24 4
gpt4 key购买 nike

我开始在我的代码中加入打印语句。为了不弄乱输出,我做了类似的事情:

dputs LEVEL, "string"

其中 LEVEL 为 0 表示错误,1 表示重要 .. 5 表示冗长,并与 DEBUG_LEVEL 进行比较。现在我的问题是,在这样的声明中:

dputs 5, "#{big_class.inspect}"

字符串总是被评估,即使我将 DEBUG_LEVEL 设置为 1。而且这个评估可能需要很长时间。我最喜欢的解决方案是这样的:

dputs 5, '#{big_class.inspect}'

然后根据需要评估字符串。但是我无法以我可以评估的形式获取字符串。所以我唯一能想到的是:

dputs( 5 ){ "#{big_class.inspect}" }

但这看起来很难看。那么我该如何评估“#{}”字符串呢?

最佳答案

你可以通过让 dputs 使用 sprintf 来做到这一点(通过 % )。这样它就可以决定不构建内插字符串,除非它知道要打印它:

def dputs(level, format_str, *vars)
puts(format_str % vars) if level <= LEVEL
end

LEVEL = 5
name = 'Andrew'
dputs 5, 'hello %s', name
#=> hello Andrew

或者,正如您所建议的,您可以传递一个 block ,该 block 将推迟插值直到该 block 实际运行:

def dputs(level, &string)
raise ArgumentError.new('block required') unless block_given?
puts string.call if level <= LEVEL
end

关于ruby - ruby 中 "#{}"字符串的惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com