2014-11-27 1 views
1

Я пытаюсь создать метод, чтобы определить, существует ли объект (в массиве), и если он является числовым.Тестирование объекта с помощью «если определено?»

Мой текущий код:

foo = [123, 456, 789, 012] 

if defined?(foo[0]) and foo[0].is_a? Numeric 
    foo_at_zero = foo[0] 
else 
    foo_at_zero = "N/A" 
    puts "Cannot find data for foo at place zero" 
end 

puts foo_at_zero 

Однако мои результаты не то, что я ожидал. Когда я изменить if defined? к элементу в массиве я не определен, он все еще возвращается как верно:

foo = [123, 456, 789, 012] 

if defined?(foo[100]) and foo[0].is_a? Numeric 
    foo_at_zero = foo[0] 
else 
    foo_at_zero = "N/A" 
    puts "Cannot find data for foo at place zero" 
end 

puts foo_at_zero 

возвращает значение в foo[0].

Вероятно if defined? не надлежащим образом проверить, является ли или нет объект существует. Есть что-то, чего я не хватает?

+2

Проверьте значение для ноля. –

+0

Проверьте свое состояние: 'определено? foo [100] # => "method" ' – sczizzo

+0

' if foo [100] и foo [0] .is_a? Numeric' не является надежным утверждением, поскольку он не работает, когда 'foo.size> 100' и' foo [100] => nil'. Вы можете утверждать, что ни один элемент 'foo' не был бы установлен в' nil' здесь, но не лучше ли писать 'if (i nil'. –

ответ

1

Если вы отметите, что defined?(foo[100]) возвращается, это на самом деле не false, это возвращение, что выражение его оценки (foo[100]) представляет собой метод (который определен) класса массива:

puts defined?(foo[100]) => method 

Для цели тренировки я считаю, это может работать для вас:

foo = [123, 456, 789, 012] 

if (foo[100] != nil) and (foo[0].is_a? Numeric) 
    foo_at_zero = foo[0] 
else 
    foo_at_zero = "N/A" 
    puts "Cannot find data for foo at place zero" 
end 

puts foo_at_zero 

Проверьте if foo[100] != nil и вы будете знать, если элемент определен или нет.

UPDATE: Я хотел бы сделать что-то вроде этого:

foo = [123, 456, 789, 012] 

def validate value 
    foo_at_zero = "N/A" 
    if (value != nil) and (value.is_a? Numeric) 
     foo_at_zero = value 
    end 
    return foo_at_zero 
end 

puts validate foo[0] 
+0

Хорошо, что имеет большое значение, почему независимо от того, что значение, это всегда было бы правдой. Каким будет лучший способ сделать эту проверку? Скажем, если бы я хотел вызвать метод, в котором foo_at_zero проверил бы эти условия, прежде чем назначать значение? –

+1

Не уверен, правильно ли я вас понял, исправьте меня, если я ошибаюсь, вы хотите поместить этот код внутрь метода, который делает эти проверки и возвращает соответствующее значение foo_at_zero? – danielR

+0

Да. Im, с трудом делая метод, когда before присваивает переменную, он проверяет! = Nil и ia a? Числовой. В противном случае назначение «N/A» –

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