Почему выражение (true == true == true) вызывает синтаксическую ошибку?

рубин

 true == true == true
  

синтаксическая ошибка, неожиданный тэкв

против. JavaScript

 true == true == true
// => true

против. C :

 1 == 1 == 1
// => 1
65 голосов | спросил Rrr Rrr 9 Jam1000000amTue, 09 Jan 2018 03:02:38 +030018 2018, 03:02:38

3 ответа


0

Направление ассоциации, которое контролирует порядок операторов, оценивающих свои аргументы, не определено для метода ==, как и для ---- +: = 1 =: + ----, ===, != и методы =~ (все они имеют одинаковые приоритет и формировать отдельную группу приоритетов исключительно).

Документация

Таким образом, порядок вычисления в случае, когда несколько операторов из списка, упомянутого выше, объединены в цепочку, должен быть установлен явно через

  • скобка <=>:

    ()
  • или оператор точки (true == true) == true # => true true == (true == true) # => true ( может быть опущено для последней проверки на равенство в строке ):

    .
ответил potashin 9 Jam1000000amTue, 09 Jan 2018 03:30:38 +030018 2018, 03:30:38
0

TL; DR Синтаксис подразумевает, что все 3 значения равны, это не то, что он делает в javascript или C, поэтому, если ruby ​​выдает синтаксическую ошибку, дверь открыта для реализации в будущем.

Если я правильно понимаю вопрос, value_a == value_b == value_c должен возвращать true только в том случае, если все они используют eqel, используя == в качестве оператора сравнения, как показано в этот метод

# version 1
def compare_3_values(a, b, c)
  a == b && a == c && b == c
end

есть и другой возможный ожидаемый результат. реализовать это, как показано в предыдущем ответе:

#version 2
def compare_3_values(a, b, c)
  (a == b) == c
end

Результаты отличаются друг от друга.

JavaScript всегда использует версию 2, которая довольно бесполезна, поскольку третий элемент всегда сравнивается с истинным или ложным (0 или 1, если третий элемент является целым числом), поэтому false == false == true возвращает true.

чтобы гарантировать, что если метод является одним из трех значений, которые он вызывает только один раз, нам нужно создать копию (не ссылку) всех трех переменных, а затем выполнить сравнения следующим образом:

def compare_3_values(a_original, b_original, c_original)
  #duplicate all three values as a, b, c
  a, b, c = a_original.dup, b_original.dup, c_original.dup

  a == b && b == c && a == c
end
  

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

     

для любого другого языка он сломал бы так много кода, что даже если бы он был реализован в более поздней основной версии, для его включения или выключения потребовался бы флаг /настройка на долгие годы, следовательно, он никогда не будет иметь смысла .

Некоторые интересные результаты в Ruby

false .== false == true
=> true

false .== true == false
=> true

true .== false == false
=> true

false .== false == false
=> false

true .== true == false
false

И в JavaScript

false == false == true
=> true

false == true == false
=> true

true == false == false
=> true

false == false == false
=> false

true == true == false
=> false

Edit , также протестированный в C, действует аналогично JavaScript в том, что сравнивает результат первых двух значений с третьим значением

ответил Arye Eidelman 14 AMpSat, 14 Apr 2018 01:01:53 +030001Saturday 2018, 01:01:53
0

первый ответ превосходен, но на всякий случай не совсем ясно (и люди спрашивают, почему), вот еще несколько примеров.


В C оператор == является ассоциативным слева направо, а логическое значение представляется как 1 (true) и 0 (false). ), поэтому первый 1 == 1 оценивается как 1 (true), а затем вы оцениваете результат первого выражения со вторым. Вы можете попробовать:

2 == 2 == 2 // => 0

Который в C, оценивается как:

(2 == 2) == 2
1 == 2 // => 0

В Javascript, как и в C, == ассоциативно слева направо. Давайте попробуем с 0 на этот раз (хотя тот же пример из C будет работать также):

0 == 0 == 0
false

Опять же:

0 == 0 == 0
true == 0 // => false

В Ruby == не имеет ассоциативных свойств, т.е. его нельзя использовать несколько раз в одном выражении, поэтому выражение не может быть оценено. Почему это решение было принято - вопрос к автору языка. Кроме того, Ruby не определяет числовое значение 1 как логическое значение, поэтому 1 == true оценивается как ложное.

второй ответ утверждает, что в Ruby есть некоторые «странные» случаи, но все они оцениваются, как и ожидалось:

(1 == 1) == 1
true == 1 # => false

1 == (1 == 1)
1 == true # => false

1 .== 1 == 1
(1 == 1) == 1
true == 1 # => false

false .== false == true
(false == false) == true
true == true # => true

false .== true == false
(false == true) == false
false == false # => true

true .== false == false
(true == false) == false
false == false # => true

false .== false == false
(false == false) == false
true == false # => false

true .== true == false
(true == true) == false
true == false # => false
ответил Mayo 17 PMpTue, 17 Apr 2018 22:17:11 +030017Tuesday 2018, 22:17:11

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132