Ruby && = крайний регистр - PullRequest
6 голосов
/ 06 июня 2010

Небольшой случай, но есть идеи, почему && = будет вести себя так? Я пользуюсь 1.9.2.

obj = Object.new
obj.instance_eval {@bar &&= @bar} # => nil, expected
obj.instance_variables # => [], so obj has no @bar instance variable

obj.instance_eval {@bar = @bar && @bar} # ostensibly the same as @bar &&= @bar
obj.instance_variables # => [:@bar] # why would this version initialize @bar?

Для сравнения, || = инициализирует переменную экземпляра в ноль, как я и ожидал:

obj = Object.new
obj.instance_eval {@foo ||= @foo}
obj.instance_variables # => [:@foo], where @foo is set to nil

Спасибо!

1 Ответ

8 голосов
/ 06 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...