我正在寻找最短,最简单的Ruby单行程序来执行一次语句。想法是在调试时使用它来快速将调试语句添加到一个只执行一次的循环中。
迄今为止,我想出的最好:
puts "do something interesting exactly once!" if (once ||= "0").next! == "1"
你能想出更短的东西吗?
已添加以澄清:
问题的想法是关注"做一次"部分而不是关于"做一些有趣的事情"部分。应该假设代码执行一次可能是任何事情,而不仅仅是一个put语句。
理想的解决方案也适用于不同类型的循环结构。例如。正如所指出的那样,只有在循环上下文之外已经定义once
变量或者如果使用的循环上下文没有创建新的词法范围时,我的初始解决方案才有效。
触发此问题的原始用例略有不同 - 看起来更像是下面的内容。但我虽然上面这个更简单的例子更容易解释我正在寻找的那种解决方案。
def process
do_some_preprocessing()
raise SomeError if <once> # added temp. for debugging purposes - the <once> part is what this question is about!
dangerous_operation() # this can raise SomeError under certain conditions
rescue SomeError
attempt_to_rescue() and retry
end
答案 0 :(得分:2)
好吧,你可以滥用lambda和闭包。
->{puts "do something interesting exactly once!";x=->{x}}[][]
#=> do something interesting exactly once!
#=> #<Proc:0x5465282c@(irb):10 (lambda)>
lambda的原始内容只运行一次;任何后续调用都只会返回一个空的proc。
你可以选择滥用全局变量来获得更真实的&#34; one-liner&#34;,但它很可怕。
$x ||= puts("do something interesting exactly once!") || 1
答案 1 :(得分:1)
debug = ["do something interesting exactly once!"]
puts debug.pop # "do something interesting exactly once!"
puts debug.pop # nil
答案 2 :(得分:0)
最初的想法会产生代码嗅觉。它导致代码会让别人挠头,这不是一件好事。生成明显且易于理解的代码将使您和其他程序员的工作更轻松。
编写需要一段时间才能搞清楚的代码将会花费你一段时间才能确定将来如果你正在进行调试,那么请对未来的自己好一点。
我坚持使用标准方式,使用简单的标志:
once = false
2.times do
puts "do something interesting exactly once!" unless once
once ||= true
end
这导致此输出:
# >> do something interesting exactly once!
答案 3 :(得分:0)
(回答编辑以反映评论中的讨论)
您的代码将无法执行您想要的操作,它将取决于您使用的循环结构。
这将有效:
puts "do something interesting exactly once!" if once = once.nil?
但是有了这个,你必须在once
之前定义once = nil
(对你自己的代码来说也是如此)。这是因为否则,once
变量的范围将被限制在each
循环内的块,导致它失败。这可以在for loop
内完成(你必须测试它的方式):
(1..3).each do # 3.times would behave just the same
puts "once has not been defined before! Won't work!" if once = once.nil?
end
# >once has not been defined before! Won't work!
# once has not been defined before! Won't work!
# once has not been defined before! Won't work!
for i in 1..3 do
puts "Works because of the way for loops treat vars within loop" if once = once.nil?
end
# >Works because of the way for loops treat vars within loop
为了避免这个问题而不必首先初始化变量,可以使once
全局:
(1..3).each do
puts "$once's scope is not restrained to the 'each' loop! Works!" if $once = $once.nil?
end
# >$once's scope is not restrained to the 'each' loop! Works!