m1 = s.match(p1) && m2 = s.match(p2)
&&
имеет более высокий приоритет, чем =
, поэтому сначала выполняется операция &&, которая ниже
s.match(p1) && m2 = s.match(p2)
=> 'hello' && m2 = 'world'
=> 'world'
, world
присваивается m2
возвращает m2
, что равно world
, а затем выполняет следующую операцию присваивания.
m1 = {OUTPUT OF (s.match(p1) && m2 = s.match(p2))}
m1 = 'world'
Прочитайте о Приоритет логических операторов в Ruby
Лучше использовать скобки, чтобы сделать его более явным
if (m1 = s.match(p1)) && (m2 = s.match(p2))
...
end
ИЛИ можно сначала выполнить операцию присваивания
m1 = s.match(p1)
m2 = s.match(p2)
if m1 && m2
...
end