我有一个这样的代码块(这是工作版本)

@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

当我试图在event_id语句中设置变量sessions_hash.each时,我无法让它在循环之外赋值(收到未知变量警告)。我想知道这是为什么,以及如何规避。
下面是一个失败的例子(尽管日志显示变量设置正确),但我在创建变量的循环之外无权访问它。
@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,但这退出了循环。我不明白什么?

最佳答案

块实际上是一种匿名函数,因此它有自己的作用域,但它可以访问周围作用域中的变量。
只需在块开始之前初始化event_id,使其成为父方法的元素。

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

07-26 08:06