Зачем мне нужны круглые скобки для моего троичного оператора при добавлении в строку? - PullRequest
0 голосов
/ 08 марта 2020

Я практикую следующую проблему в Ruby. https://leetcode.com/problems/defanging-an-ip-address/

Я считаю, что мне нужно иметь круглые скобки в моем троичном операторе, чтобы получить тот же результат, что и эквивалентную строку кода с условием if / else. Это почему ?

# @param {String} address
# @return {String}
def defang_i_paddr(address)
  return address if address.isEmpty?

  result_from_ternary = ''
  result_from_if = ''

  address.each_char do |letter|
    # Why do I need parentheses here ?
    result_from_ternary << (letter == '.' ? '[.]' : letter)

    # Why dont I need parentheses here ?
    result_from_if << if letter == '.'
                        '[.]'
                      else
                        letter
                      end
  end
  result_from_ternary = ''
end

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Причина: приоритет оператора . Когда нет скобок для указания Ruby, тогда Ruby сначала оценивает оператор с более высоким приоритетом.

Просматривая таблицу Ruby приоритета оператора , вы можете видеть, что << имеет более высокий приоритет, чем == и оператор ? :.

Это означает, что Ruby будет интерпретировать

result_from_ternary << letter == '.' ? '[.]' : letter

в таком порядке

((result_from_ternary << letter) == '.') ? '[.]' : letter

Это, очевидно, не то, что вы хотите, поэтому вам нужно "переопределить" порядок приоритета по умолчанию с добавлением скобок:

result_from_ternary << (letter == '.' ? '[.]' : letter)
1 голос
/ 08 марта 2020

Просто давайте посмотрим на этот пример:

a1 = []
a1 << 1 == 2 ? 'a' : 'b'
p a1  #[1]

a2 = []
a2 << ( 1 == 2 ? 'a' : 'b')
p a2 #["b"]

Без скобок код a1 << 1 == 2 ? 'a' : 'b' оценивается как a1 << 1, а результат ([1]) сравнивается с 2. В зависимости от результата (false) троичная операция возвращает 'b'.

Если вы измените тест на !=, результат будет a.

Пример:

p    a1 << 1 == 2 ? 'a' : 'b'
p    a1 << 1 != 2 ? 'a' : 'b'

Когда вы устанавливаете паретезы, сначала выполняется команда 1 == 2 ? 'a' : 'b'. Затем результат (b) добавляется в массив.

...