ruby-on-rails - Ruby 中的 &block 是什么?它是如何在此处的方法中传递的?

标签 ruby-on-rails ruby

在 Ruby on Rails 书中看到这段代码。第一个来自 View ,第二个是辅助模块。我不明白 &blockattributes={} 是如何工作的。谁能指导我学习某种解释这一点的教程?

<% hidden_div_if(@cart.items.empty?, :id => "cart") do %>
 <%= render(:partial => "cart", :object => @cart) %>
<% end %>

module StoreHelper
 def hidden_div_if(condition, attributes = {}, &block)
  if condition
   attributes["style"] = "display: none"
  end
   content_tag("div", attributes, &block)
  end
end

最佳答案

block 是 ruby​​ 的一个相当基本的部分。它们由 do |arg0,arg1| 分隔... 结束{ |arg0,arg1,arg2| ...

它们允许您指定要传递给方法的回调。 可以通过两种方式调用此回调 - 通过捕获 通过指定以 & 为前缀的最终参数,或通过 使用 yield 关键字:

irb> def meth_captures(arg, &block)
       block.call( arg, 0 ) + block.call( arg.reverse , 1 )
     end
#=> nil
irb> meth_captures('pony') do |word, num|
       puts "in callback! word = #{word.inspect}, num = #{num.inspect}"
       word + num.to_s
     end
in callback! word = "pony" num = 0
in callback! word = "ynop" num = 1
#=> "pony0ynop1" 
irb> def meth_yields(arg)
       yield(arg, 0) + yield(arg.upcase, 1)
     end
#=> nil
irb> meth_yields('frog') do |word, num|
       puts "in callback! word = #{word.inspect}, num = #{num.inspect}"
       word + num.to_s
     end
in callback! word = "frog", num = 0
in callback! word = "FROG", num = 1
#=> "frog0FROG1"

请注意,我们的回调在每种情况下都是相同的 - 我们可以删除 通过将我们的回调保存在一个对象中,然后将其传递给每个对象来重复 方法。这可以使用 lambda 捕获对象中的回调来完成, 然后通过使用 & 前缀传递给方法。

irb> callback = lambda do |word, num|
       puts "in callback! word = #{word.inspect}, num = #{num.inspect}"
       word + num.to_s
     end
#=> #<Proc:0x0052e3d8@(irb):22>
irb> meth_captures('unicorn', &callback)
in callback! word = "unicorn", num = 0
in callback! word = "nrocinu", num = 1
#=> "unicorn0nrocinu1"
irb> meth_yields('plate', &callback)
in callback! word = "plate", num = 0
in callback! word = "PLATE", num = 1
#=> "plate0PLATE1"

重要的是要理解 & 在这里作为函数最后一个参数的前缀的不同用法

  • 在函数定义中,它将任何传递的 block 捕获到该对象中
  • 在函数调用中,它将给定的回调对象扩展为一个 block

如果您环顾四周,到处都在使用 block ,尤其是在迭代器中,例如 Array#each

关于ruby-on-rails - Ruby 中的 &block 是什么?它是如何在此处的方法中传递的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/814739/

相关文章:

ruby-on-rails - Rails has_many 带有额外属性的复选框

javascript - 在 Dev 环境中加快 Rails 在整页加载时加载 Backbone Javascript Assets 的方法?

css - HAML - 表单样式和技巧 - 纯静态页面的新功能

ios - calabash-ios 物理设备测试,应用程序启动但崩溃

ruby-on-rails - Rails Alpha2 国家/地区 到 真实国家/地区名称

mysql - Rails 测试数据库缺少主键

mysql - MySql 和 Rails 中的时区

ruby-on-rails - 在 heroku 上的 rails 应用程序中阻止 IP

ruby-on-rails - ElasticSearch Aggregator,按文本/关键字排序

ruby-on-rails - 将 Bootstrap 4 与 Rails 6 Webpacker 一起使用时出错