1. Как и всё в Ruby, операция присваивания является выражением, т.е. возвращает значение.
2. Если выражение, содержащее присваивание находится на месте условия в конструкциях типа if
, unless
и т.д., то любое возвращаемое им значение, кроме nil
и false
интерпретируется Ruby как ИСТИНА.
3. Warning выбрасывается по той причине, что из-за частых опечаток (=
вместо ==
и наоборот) не рекомендуется использовать присваивание в условиях. Наверное и в кодстайле это прописано.
# bad (+ a warning)
if v = array.grep(/foo/)
do_something(v)
# some code
end
# good (MRI would still complain, but RuboCop won't)
if (v = array.grep(/foo/))
do_something(v)
# some code
end
# good
v = array.grep(/foo/)
if v
do_something(v)
# some code
end
В стайлгайде
допускается писать присваивание в скобках. Но с комментарием, что руби будет на такое ругаться. Моё мнение — никогда так не делайте, чтобы потом не думать каждый раз, то ли вы опечатались, то ли тут реально должен быть один знак
=
. Объявляйте переменную до использования её в условии, если надо.
В книжке JavaScript: The Good Parts про это есть (см. картинку).