4

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

@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_idsessions_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

我试图明确地 return event_id,但退出了循环。我不明白什么?

4

2 回答 2

4

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

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

event_id = nil
@full_user_schedule[0].attributes.each do |event_name, attending|
   ...
于 2012-12-19T17:15:16.193 回答
0

在第二个代码示例中,在传递的块中创建和分配 event_id sessions_hash.each。它只存在于该块内,不能从块外的代码访问。这称为范围。

在第一个示例中,您将分配给 event_name,它在传递给的块中定义,@full_user_schedule[0].attributes.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

我移动了这条线@user_schedule...,所以它在同一个范围内event_id

于 2012-12-19T17:18:55.403 回答