为什么ruby的'.each'使用'for'给出了不同的结果?

Mic*_*ant 2 ruby ruby-on-rails ruby-on-rails-3

我试图将for x in y循环切换为each_with_index.首先,我试图切换foreach.之前的代码是

...
- row_bg_color_group = 'row_color_group_1'
- for link in @links
  - construct_hyperlink(link.url_address, link.alt_text)
  - if link.group.group_name != (current_group ||= '')
    - display_group = current_group = link.group.group_name
    - row_bg_color_group = rotate_rows_color_group
  - else
    - display_group = ''
  %tr{:class => "#{row_bg_color_group}"}
    %td
      = link_to display_group, link.group, {"title" => link.group.group_description}
    %td
      %span#mainLink
        = sanitize @address_url
    %td= link.version_number
....
Run Code Online (Sandbox Code Playgroud)

并且rotate_rows_color_group是app/helpers的帮助者.代码是

def rotate_rows_color_group
  if session[:group_shading] == 'true' || params[:show]
    cycle('row_color_group_1 color_group_1', 'row_color_group_2 color_group_2', 'row_color_group_3 color_group_3')
  else
    cycle('row_color_group_1', 'row_color_group_2', 'row_color_group_3')
  end 
end 
Run Code Online (Sandbox Code Playgroud)

我做的最初改变就是转换

- for link in @links
Run Code Online (Sandbox Code Playgroud)

成为

- @links.each do |link|
Run Code Online (Sandbox Code Playgroud)

这改变了我的观点 在此输入图像描述

在此输入图像描述

组名重复出现.这是范围问题吗?

Uri*_*ssi 7

由于.each使用了块,因此每次输入时都会重新声明其中声明的任何变量.

要避免这种情况,只需current_group在块外声明:

...
- row_bg_color_group = 'row_color_group_1'
- current_group = ''
- @links.each do |link|
  - construct_hyperlink(link.url_address, link.alt_text)
  - if link.group.group_name != current_group
    - display_group = current_group = link.group.group_name
    - row_bg_color_group = rotate_rows_color_group
  - else
    - display_group = ''
  %tr{:class => "#{row_bg_color_group}"}
    %td
      = link_to display_group, link.group, {"title" => link.group.group_description}
    %td
      %span#mainLink
        = sanitize @address_url
    %td= link.version_number
....
Run Code Online (Sandbox Code Playgroud)