2016-02-27 4 views
-2

Я пытаюсь определить метод, который возвращает true, если массив содержит строку или число. Я хочу, чтобы этот метод возвращал:Как проверить отдельные классы с помощью `is_a?`?

a = [ 1, 2, 3, "string" ] 
any_strings_or_numbers?(a) 
#=> true 

b = [ "no numbers" ] 
any_strings_or_numbers?(b) 
#=> true 

c = [ 1.0 ] 
any_strings_or_numbers?(c) 
#=> true 

c = [ ] 
any_strings_or_numbers?(c) 
#=> false 

Это то, что я пробовал, и он не работает:

def any_strings_or_numbers?(a) 
    a.any? {|num| num.is_a?(String || Integer) } 
end 
+2

'num' - это вводящее в заблуждение имя переменной, если вы ожидаете как числа, так и строки. – Stefan

ответ

1
def any_strings_or_numbers?(a) 
    a.any? {|num| case num; when String, Integer then true; end} 
end 
+0

Для дополнительного случая в этом случае тот же, что и 'String === num || Integer === num', разница только в том, что 'case' возвращает' nil'. – Ilya

+0

Спасибо за помощь! как вы его получите, чтобы вернуть true, если он имеет только число с плавающей запятой? – kelsonpw

+2

@kelsonpw Вам действительно нужно показать некоторые усилия, это не так сложно. – Stefan

2

Вы пропустили, что существует несколько классов чисел в рубин.

1.class 
# => Fixnum 

(2**65).class 
# => Bignum 

1.0.class 
# => Float 

Суперкласс для всех чисел Numeric. Поэтому вы, вероятно, захотите узнать, является ли объект экземпляром подкласса Numeric или String.

def any_strings_or_numbers?(a) 
    a.any? {|x| x.kind_of?(String) || x.kind_of?(Numeric) } 
end 
+1

Вы имеете в виду экземпляр подкласса. – sawa

+0

@sawa Да, я его отредактировал. – Meier

+0

Спасибо за помощь! как вы его получите, чтобы вернуть true, если он имеет только число с плавающей запятой? – kelsonpw

-1

Прежде всего, вы получите любой элемент является экземпляром или все элементы являются экземплярами? В большинстве случаев в реальной жизни мы проверяем все элементы, я просто любопытно, может быть ваш случай специальный :) Позвольте мне предложить этот путь:

collection.any? do |element| 
    [String, Numeric].any? { |klass| element.is_a? klass } 
end 

К таким образом его легко добавить больше возможных классов, параметризовать белый список или вывести проверку на метод.

PS. Если вам нужно все элементов, являющихся экземплярами классов из белого списка, чем использование все? для итерации верхнего уровня.

Смежные вопросы