应该是一个简单的。我想,从阅读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'吗? 答案 0 :(得分:19)
“与
return
和break
关键字一样,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或您认为合适的任何名称来处理。
这些天我认为复杂的程序方法是一种气味,在这种方法中有一个对象。