Ruby parses your code like this:

  if i = (a.index(k.to_sym) && k.to_s =~ /b/)

You can fix this by using "and" or explicit parenthesis:

  if i = a.index(k.to_sym) and k.to_s =~ /b/
  if (i = a.index(k.to_sym)) && k.to_s =~ /b/

// Magnus Holm


On Tue, Jun 21, 2011 at 22:28, Benjamin ter Kuile <bterkuile / gmail.com> wrote:
>
> Issue #4914 has been reported by Benjamin ter Kuile.
>
> ----------------------------------------
> Bug #4914: Array#index fails when used in if statement assignment
> http://redmine.ruby-lang.org/issues/4914
>
> Author: Benjamin ter Kuile
> Status: Open
> Priority: Normal
> Assignee:
> Category:
> Target version:
> ruby -v: 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]
>
>
> cat /etc/issue: Ubuntu 11.04
> rvm -v: rvm 1.6.2
> rvm 1.9.2, ruby -v: ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]
> Also tested with: rvm 1.9.2-head, ruby -v: ruby 1.9.2p274 (2011-06-06 revision 31932) [x86_64-linux]
>
> Test code:
>
> a = [:a, :b, :c]
> for k in 'a'..'c'
> if i = a.index(k.to_sym) && k.to_s =~ /b/
>  puts i
> end
> end
> for k in 'a'..'c'
> i = a.index(k.to_sym)
> if i && k.to_s =~ /b/
>  puts i
> end
> end
>
> output:
> 0
> 1
>
> expected output:
> 1
> 1
>
>
> --
> http://redmine.ruby-lang.org
>
>