gpt4 book ai didi

ruby - 何时使用 block

转载 作者:数据小太阳 更新时间:2023-10-29 06:29:10 26 4
gpt4 key购买 nike

我喜欢 Ruby block !它们背后的想法非常简洁方便。

我刚刚回顾了过去一周左右的代码,基本上我写过的每一个 ruby​​ 函数,我注意到没有一个返回值(value)!我总是使用 block 来传回数据,而不是返回值!

我什至发现自己在考虑编写一个小的状态类,它允许我编写如下代码:

something.do_stuff do |status|
status.success do
# successful code
end

status.fail do
# fail code
puts status.error_message
end
end

我是不是用了太多积木?是否有使用 block 的时间和使用返回值的时间?

有什么需要注意的陷阱吗?我对 block 的大量使用会在某个时候来咬我吗?

最佳答案

整个事情会更具可读性:

if something.do_stuff
#successful code
else
#unsuccessful code
end

或者使用通用的 rails 习语:

if @user.save
render :action=>:show
else
@user.errors.each{|attr,msg| logger.info "#{attr} - #{msg}" }
render :action=>:edit
end

恕我直言,避免返回 bool 值是对代码块的过度使用。

如果 . . .

它允许代码在不关闭该资源的情况下使用该资源

 open("fname") do |f|
# do stuff with the file
end #don't have to worry about closing the file

调用代码必须对结果进行非平凡的计算

在这种情况下,您可以避免将返回值添加到调用范围。对于多个返回值,这通常也很有意义。

something.do_stuff do |res1, res2|
if res1.foo? and res2.bar?
foo(res1)
elsif res2.bar?
bar(res2)
end
end #didn't add res1/res2 to the calling scope

代码必须在 yield 之前和之后调用

您在某些 Rails 助手中看到了这一点:

 <% content_tag :div do  %>
<%= content_tag :span "span content" %>
<% end -%>

当然 iterators 是一个很好的用例,因为它们(被 ruby​​-ists 认为)比 for 更漂亮。循环或 list comprehensions .

当然不是一个详尽的列表,但我建议您不要仅仅使用 block ,因为您可以。

关于ruby - 何时使用 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com