простой ruby, если только ошибка метода - PullRequest
0 голосов
/ 02 апреля 2020

Я очень новичок в ruby. Это может показаться вам очень наивным, но я не могу понять, что здесь происходит

matched_criteria = match_criteria(c1, c2)
puts "answer is #{matched_criteria}"

def match_criteria(crit_val1, crit_val2)
  if crit_val1.present?
    puts "present"
  else
    puts "absent"
  end

  return true unless crit_val1.present? || crit_val2.present?
  return false unless crit_val1.present? && crit_val2.present?
end

Вывод: отсутствует ответ ложный

пожалуйста, объясните

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020
def match_criteria(crit_val1, crit_val2)
  # Check if #1 is present? or blank?
  if crit_val1.present?
    puts "present"
  else
    puts "absent"
  end

  # Return true unless EITHER (||) are present
  # ...or you could think of it like...
  # Return true if BOTH (&&) are blank
  return true unless crit_val1.present? || crit_val2.present?
  # Return false unless BOTH are present
  # ..or...
  # Return false if EITHER is blank
  return false unless crit_val1.present? && crit_val2.present?
end

На самом деле это вопрос Ruby на Rails. blank? и present? - это методы экземпляра, доступные только в Rails, но не в стандартной библиотеке Ruby.

0 голосов
/ 02 апреля 2020

Ваша проблема не имеет ничего общего с Ruby (или Rails) per se . Это связано с неправильным пониманием задействованных логических операторов, что, конечно, будет проблемой на любом языке.

Учтите это:

def test(x, y)
  return true unless x || y
  false unless x && y
end

p test(true, false)  # => false
p test(true, true)   # => nil
p test(false, false) # => true

В первом тесте (x = true, y = false) первое условие не выполняется, потому что x || y имеет значение true (оно будет успешным, только если x || y оценено как false, поскольку вы используете unless вместо if). Второе условие успешно, потому что x && y не верно. Таким образом, метод возвращает false.

Во втором тесте ни одно из условий не выполняется, поскольку оба значения x || y и x && y оцениваются как true. (Опять же, поскольку вы используете unless вместо if, условие может быть успешно выполнено, только если оно оценивается как false.) Итак, метод возвращает nil.

В третьем тесте первое условие успешно, потому что x || y оценивается как false. Итак, метод возвращает false.

Маловероятно, что вам нужны эти логические условия. Во-первых, вы, вероятно, не хотите набор логических условий, которые не охватывают все возможности. Также я не вижу причин для использования unless вместо if; кажется, что вы без необходимости усложняете свою логику c.

Конечно, вы точно не объяснили, какие логические условия вы ищете, поэтому мы все играем здесь в «слепую механику» c »в некоторой степени. Но я чувствую, что вы пытаетесь проверить, присутствует ли ваш crit_val1 или crit_val2, и вернуть false, если какой-либо из них присутствует. Если это так, все, что вам нужно сделать, это:

def match_criteria(crit_val1, crit_val2)

    # other stuff

    return false if crit_val1.present? || crit_val2.present?
    true
end
0 голосов
/ 02 апреля 2020

Каждый раз, когда вы вызываете match_criteria с одним параметром, который является непустым значением, условие

crit_val1.present? || crit_val2.present?

будет true, но, поскольку вы отрицаете его, первый оператор возврата не получает call.

В той же ситуации второе условное выражение оценивается как ложное, а поскольку вы отрицаете его, второе возвращение успешно возвращает false.

...