从’下一个’返回一个坏主意的值?
应该是一个简单的。 我想,通过阅读这篇博文 ,我可以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’吗?
“就像
return
和break
关键字一样,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或您认为合适的任何名称来处理。
这些天我认为复杂的程序方法是一种气味,在这种方法中有一个对象。