Ruby массив содержит типы? - PullRequest
       0

Ruby массив содержит типы?

3 голосов
/ 06 февраля 2020

Мне нужна функция, чтобы проверить, содержит ли массив другие массивы, или, в более общем случае, если массив содержит определенный класс. Мой наивный первый подход:

found=false
[1,"a",[],:asdf].each { |x| found=(x.is_a? Array) ? true : found }
puts found

Есть ли способ оптимизировать это?

Ответы [ 4 ]

6 голосов
/ 06 февраля 2020

В более новых Рубинах (2.5+) вам не нужно передавать блок на any?. Эти ссылки ведут на последние документы, в которых есть аналогичный пример проверки целых чисел.

Поэтому вы можете просто использовать:

[1, "a", [], :asdf].any?(Array)
# => true

[1, "a", :asdf].any?(Array)
# => false

Это кажется самым простым синтаксисом и наиболее разумным подходом, если ваша Ruby версия позволяет это:)

4 голосов
/ 06 февраля 2020

Можно попробовать # любой?

Например:

[1,"a",[],:asdf].any? { |el| el.is_a? Array }
#=> true
1 голос
/ 06 февраля 2020

этот подход повторяется по всем элементам, даже если вы нашли массив. в вашем тестовом примере он будет повторяться по : asdf , и вам не нужно проверять это.

Я думаю, что вам нужно выйти из l oop, если вы нашли определенный тип (Массив в нашем примере).

found = false
[1,"a",[],:asdf].each do |x|
    if x.is_a? Array
     found = true
     break
    end
end

puts found

Также вы можете использовать любой вместо каждый

found = [1,"a",[],:asdf].any? { |x| x.is_a? Array }
puts found # true
1 голос
/ 06 февраля 2020

Почти всегда, когда вы используете each, вам не хватает некоторой абстракции более высокого уровня.

В этом случае этой абстракцией является метод Array#any?, который будет вернуть true, если какой-либо элемент массива удовлетворяет предикату:

[1, "a", [], :asdf].any?(Array)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...