ruby - 循环中的循环和在深度循环中分配变量

标签 ruby variables loops closures

我有这样一段代码(这是工作版本)

@full_user_schedule[0].attributes.each do |event_name, attending|
   if attending
     sessions_hash.each do |id, name|
       event_name = event_name.sub(name, id.to_s) if event_name.include? name 
     end
     @user_schedule.merge!(event_name => attending)
   end
end

当我尝试在 sessions_hash.each 语句中设置变量 event_id 时,我无法让它在该循环之外进行分配(收到未知变量警告) .我想知道为什么会这样,以及如何规避它。

下面是一个失败的例子(尽管日志显示变量设置正确),我无法在创建它的循环之外访问它。

@full_user_schedule[0].attributes.each do |event_name, attending|
   if attending
     sessions_hash.each do |id, name|
       event_id = event_name.sub(name, id.to_s) if event_name.include? name 
     end
     @user_schedule.merge!(event_id => attending)
   end
end

我试图显式返回 event_id,但那退出了循环。我有什么不明白的?

最佳答案

block 实际上是一种匿名函数,因此它有自己的作用域,但它确实可以访问周围作用域中的变量。

只需在 block 开始之前初始化event_id,使其成为父方法的元素。

event_id = nil
@full_user_schedule[0].attributes.each do |event_name, attending|
   ...

关于ruby - 循环中的循环和在深度循环中分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957336/

相关文章:

ruby - Sinatra 和 DataMapper 协会

ruby - 在 irb 中发现的 Gem,而不是在 Ruby 中

ruby-on-rails - rails expire_page 没有删除缓存的文件

javascript - 当 y 变化时,如何保持其值取决于变量 y 的变量 x 更新?

json - 如何在 jq 的 "join"函数中使用换行符 (\n) 和制表符 (\t) 等非显示字符

python - 在函数内更改全局变量

java - 在Java中的foreach循环中调用remove

ruby 正则表达式 : "capture string unless it is followed by..."

python - 检查 float 是否相等时无限循环

jQuery 回调函数仅在最后一个循环中触发