Короткое описание случая Ruby с использованием include? Не будет работать - PullRequest
5 голосов
/ 04 октября 2010

У меня есть следующий код с небольшой ошибкой, оператор case возвращает значение «other», хотя первый оператор «when» оценивает true и должен возвращать «boats».

Я смотрю на это целую вечность, должно быть, что-то маленькое.

CATEGORIES = {:boats  => [1, 2, 3, 4, 5, 6],
              :houses => [7, 8, 9, 10],
              :other  => [11,12,13,14,15,16]
             }

category_id = 1

category = case category_id
  when CATEGORY_CLASSES[:boats].include?(category_id); "boats"
  when CATEGORY_CLASSES[:houses].include?(category_id); "houses"
  else "other"
end

Спасибо!

Ответы [ 3 ]

44 голосов
/ 25 ноября 2011

Вы можете расширить массив в , когда оператор выглядит следующим образом:

category = case category_id
  when *CATEGORY_CLASSES[:boats]; "boats"
  when *CATEGORY_CLASSES[:houses]; "houses"
  else "other"
end
11 голосов
/ 04 октября 2010
Оператор

A case обычно является сокращением для оператора if. Ваш может быть переписан как:

if CATEGORY_CLASSES[:boats].include?(category_id) === category_id
  category = "boats"
elsif CATEGORY_CLASSES[:houses].include?(category_id) === category_id
  category = "houses"
else
  category = "other"
end

Когда вы смотрите на это в этой форме, вы должны ясно видеть проблему; в то время как include? возвращает логическое значение, вы сравниваете его с целочисленным значением.

7 голосов
/ 04 октября 2010

(Я собираюсь игнорировать тот факт, что ваш хэш на самом деле не содержит ни одного ключа, который вы проверяли, и притворяться, что вы проверяете ключи, которые на самом деле находятся в хэше. Надеюсь, это правильно предположение.)

Вы, похоже, неправильно поняли, что такое case утверждение. Он проверяет значение объекта оператора case, а не просто запускает группу смутно связанных if s. * * * * * * * -Классы сравниваются с === с объектом оператора case. Так что если вы пишете CATEGORY_CLASSES[:boats].include?(category_id), то это означает либо if true === category_id, либо if false === category_id (поскольку include? возвращает либо true, либо false).

То, что вы хотите, больше похоже на CATEGORIES.find {|k,v| v.include? category_id}.first.to_s.

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