从’下一个’返回一个坏主意的值?

应该是一个简单的。 我想,通过阅读这篇博文 ,我可以next命令后立即返回一些内容:

next "new value" if axis_range == "test"

我真正想做的是在同一行记录下一个原因:

next @logger.info('skipping this item because for fun') unless (elephants.size > 0)

我在ruby doc上找不到关于next的这种用法的讨论。 代码肯定有效。 我意识到我可以用一个unless块来做这个,但是那行代码是如此简洁。

两个问题:

  • 某处有更好的文件吗?
  • 这种用法有点奇怪而不是’ruby-ish’吗?

“就像returnbreak关键字一样, next可以单独使用,也可以后跟表达式或逗号分隔的表达式列表。当在循环中使用next ,忽略next后面的任何值。表达式或表达式成为调用块的yield语句的“返回值”。“ (Ruby编程语言,David Flanagan和Yukihiro Matsumoto,2008年,第150页)

这本书给出了这个例子:

 squareroots = data.collect do |x| next 0 if x < 0 # return 0 for negative values Math.sqrt(x) end 

而这个替代方案:

 squareroots = data.collect do |x| if (x < 0) then 0 else Math.sqrt(x) end end 

我的第一印象是, next关键字在循环上下文中的作用是相当明显的 – 这是一件好事。 "new value"next "new value"的结果这一事实有点紧张,但我可以到达那里。

next @logger.info('skipping this item because for fun')我的是next @logger.info('skipping this item because for fun')可能很难理解。 info调用的结果将next返回时真的不明显,我相信很多开发者会被它抛弃。

虽然代码可能更简洁,但很难理解。 我要么评论代码正在做什么,要么用其他东西。

然而,对你的两个问题的好评。 我很乐意成为一名开发人员,以这种心态维护您的代码!

除非它在许多其他复杂的代码中间(我尝试平均每个方法2个LOC,通常是一个或两个4-8行长,并且一堆那个),我本身就不会有问题。只有一条线,平均值。

如果代码很长且难以理解,我已经取得了很大的成功,将方法拉到了自己的对象中。 我只是让方法实例化一些执行其任务的对象并询问结果,然后代码可以更简单,通常将循环减少到一行或两行,并允许它有一个方法来执行此日志记录,然后,您可以通过简单调用log_error或您认为合适的任何名称来处理。

这些天我认为复杂的程序方法是一种气味,在这种方法中有一个对象。