Оставленный правильному вычислению выражения

Если я читаю это право, то вы должны знать, что вы можете получить доступ к свойствам объекта, используя аналогичные обозначения скобок для массивов, что позволяет вам использовать переменную строку для ключа. Так, например, в вашем случае вы могли бы сделать:

let keyName = 'wiki';
games[i][keyName] = table[i][keyName];

Это дало бы (предполагая, что games[i] существовало раньше) тот же результат, что и games[i].wiki = table[i].wiki', за исключением того, что теперь очевидно, что вы всегда можете изменить значение keyName динамически создавать и читать различные свойства.

5
задан xsl 3 December 2008 в 10:35
поделиться

9 ответов

Вы на самом деле обращаетесь к функции языка, названной, "закорачивая логические выражения":

То, что это означает, является этим: Когда результат логического выражения не может изменяться больше, например, когда ясно, что выражение оценит к "истинному" или "ложному" независимо от того, что, не будут оценены остающиеся части выражения.

Например, C#, Java или JavaScript делают это, и можно полагаться на него на тех языках (для ответа на вопрос).

В Вашем случае, если MyClass не является пустым:

  • MyClass == null оценивает ко лжи
  • так как это "или" выражение, вторая часть все еще может изменить результат, таким образом, это оценено
  • myClass.Property > 0 определяет конечный результат

если MyClass является пустым:

  • MyClass == null оценивает к истинному
  • так как это "или" выражение, не имеет значения, что следует
  • больше оценки не сделано, конечный результат верен

Существуют языки, которые не закорачивают логические выражения. Классический VB является примером, здесь "myClass. Свойство> 0 дюймов были бы оценены и произвели бы ошибку, если бы MyClass был пустым ("Ничего" не назвал в VB).

14
ответ дан 18 December 2019 в 07:32
поделиться

Но будьте осторожны:

если у Вас есть что-то как

sprintf (buf, "%s %s", func1 (&var), func2 (&var));

с sideeffects на var это не определяется (в C, я не уверен, определяется ли порядок оценки на других языках), в котором порядок func1 () и func2 () выполняется (он зависит, в том, какой порядок (левый или правый), аргументы помещены на стек и оценены оттуда.

2
ответ дан 18 December 2019 в 07:32
поделиться

Замыкание накоротко описано в разделе 7.11 из спецификации C# 3.0:

Операция x || y соответствует операции x | y, за исключением того, что y оценен, только если x не верен.

Таким образом да, Вы в порядке.

Что касается других языков - мне никогда не нравится говорить за все языки. В VB.NET можно использовать OrElse и AndAlso, которые закорачиваются, но плоскость Или и И не.

5
ответ дан 18 December 2019 в 07:32
поделиться

Порядок оценки зависит от оператора, в этом случае булевская переменная или (||) определяется, чтобы быть тем, что обычно называют, закорачивая, для создания конструкций как эта работа.

0
ответ дан 18 December 2019 в 07:32
поделиться

И/или операторы на языках как Ada, Visual Basic и Паскаль не закорачивают. Они действительно обеспечивают дополнительные операторы для разрешения той функциональности, такой как "и затем" и "или иначе" в Ada.

0
ответ дан 18 December 2019 в 07:32
поделиться

Я не уверен, Вы действительно интересуются порядком или оценкой короткого замыкания?

Я не на 100% уверен, но насколько я знаю, что порядок оценки всегда будет тем же в C# (и я принимаю больше всего если не все языки .NET). Оценка короткого замыкания работает, как объяснено в предыдущих ответах.

Однако в C# можно принять решение не сорвать использующие простые операторы (и вместо &&). Обычно Вы хотите закоротить, но это может быть случай, в котором Вы хотите выполнить все оценки.

0
ответ дан 18 December 2019 в 07:32
поделиться

Python имеет короткое замыкание or и and операторы.

0
ответ дан 18 December 2019 в 07:32
поделиться

В Java и Haskell && и || закорачивают также.

Интересный в стороне: в Haskell это прибывает естественно с языком (можно определить собственные операторы, которые делают это), в то время как в Java и C# это специфично для тех двух операторов.

0
ответ дан 18 December 2019 в 07:32
поделиться

На самом деле короткое замыкание является частью, но вам также необходимо знать, гарантирует ли язык их оценку слева направо. Например, C (ANSI, ISO, C99) НЕ гарантирует оценку слева направо. В примере кода можно было бы проверить значение Property перед проверкой на NULL или сделать и то, и другое одновременно ... большинство компиляторов этого не делают, но ничто не мешает ему сделать это и полностью соответствовать спецификации. Он даже говорит вам НЕ писать такой код из-за этого.

0
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: