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

时间:2012-03-05 03:13:31

标签: ruby

应该是一个简单的。我想,从阅读this blog post我可以在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块执行此操作,但该行代码非常简洁。

两个问题:

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

3 个答案:

答案 0 :(得分:19)

  

“与returnbreak关键字一样,next可以单独使用,或者   它后面可能跟一个表达式或以逗号分隔的列表   表达式。在循环中使用next时,后面的任何值   next被忽略。然而,在块中表达式或表达式   成为调用的yield语句的“返回值”   “(Ruby Programming Language,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 

答案 1 :(得分:0)

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

让我失望的是next @logger.info('skipping this item because for fun')可能很难理解。 info调用的结果将由next返回并且我相信很多开发者会被它抛弃。

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

然而,对你的两个问题提出了很好的要求。我很乐意成为一名开发人员,用这种心态来维护你的代码!

答案 2 :(得分:0)

除非它在许多其他复杂的代码中间(我尝试平均每个方法2个LOC,通常是一个或两个4-8行长,并且并且一堆只有一行,平均出来。)

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

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