Это потому, что @bar
оценивается как ложное, и, таким образом, &&=
не будет вычислять выражение больше ... В отличие от вашего второго выражения, которое в любом случае присваивает @bar
, независимо от того, чтоследующее выражение разрешается в.То же самое относится и к случаю ||=
, который оценивает полное выражение, независимо от того, к какому исходному значению @foo
разрешено.
Таким образом, разница между вашими первыми двумя выражениями состоит в том, что в первом присваивание зависитна (неопределенное) значение @bar
, а во втором случае вы делаете безусловное назначение.&&=
НЕ является ярлыком для x = x && y
.Это ярлык для x = x && y if x
.