2016-09-12 6 views

ответ

3

попробуйте это:

arr.select! { |el| el.class != String } 

или если вы хотите только цифры:

arr.select! { |el| el.is_a? Numeric } 
+0

Он работает! Спасибо Bartek – Bitwise

+1

'select' семантически некорректно, здесь стоит использовать' reject'. – mudasobwa

0

Вы также можете использовать обратный путь и использовать reject!. Он удаляет все элементы, соответствующие установленному вами условию.

arr.reject! { |el| !el.is_a? Numeric } 

Это функционально такой же, как

arr.select! { |el| el.is_a? Numeric } 
+0

'is_a?' Или '===' предпочтительнее вызова '.class' на что-то вручную. – tadman

+1

Ваш первый пример не работает, возвращает пустой массив '[]'. Это связано с тем, что при проверке класса регулярного числа на 'class' он возвращает' Fixnum'. В то время как 'is_a?' Также учитывает классы предков. –

5

Другой способ раунд будет использовать случай равных:

[1, 5, "dog", 6].reject &String.method(:===) 
#⇒ [1, 5, 6] 
+2

Это бесполезно умно. 'reject {| s | Строка === s} 'короче, яснее и (я предполагаю) более результативна. –

+0

@ Джордан, что он короче, это факт, субъективно, я тоже нахожу его более ясным, но я не уверен в более «эффектном», поскольку я никогда не мог понять, что это значит. Также голосование, похоже, ставит под сомнение, что оно «бесполезно умно», и многие из них, очевидно, нуждаются в публикации умных ответов. –

+0

@CarySwoveland [Это то, что я имею в виду под исполнителем.] (Https://gist.github.com/jrunning/fe7c06ce17079d917a5d8dc7b65406c7) –

2

Это хорошая возможность использовать Enumerable#grep или Enumerable#grep_v:

[ 1, 5, "dog", 6 ].grep(Numeric) 
# => [1, 5, 6] 

[ 1, 5, "dog", 6 ].grep_v(String) 
# => [1, 5, 6]