使用"测试对象?如果已定义?"

时间:2014-11-27 01:07:17

标签: ruby

我正在尝试创建一个方法来确定对象(在数组中)是否存在,以及它是否为Numeric。

我目前的代码是:

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?更改为我尚未定义的数组中的元素时,它仍然返回true:

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?似乎无法正确测试对象是否存在。有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

如果你检查defined?(foo[100])正在返回什么,它实际上不是false,它返回的是它正在评估的表达式(foo[100])是一个方法(已定义) class Array:

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,您将知道其中的元素是否已定义。

<强>更新 我会做这样的事情:

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]