Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 测试对象,带有;如有定义?“;_Ruby - Fatal编程技术网

Ruby 测试对象,带有;如有定义?“;

Ruby 测试对象,带有;如有定义?“;,ruby,Ruby,我试图创建一个方法来确定一个对象(在数组中)是否存在,以及它是否是数字对象 我目前的代码是: 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 然而,

我试图创建一个方法来确定一个对象(在数组中)是否存在,以及它是否是数字对象

我目前的代码是:

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]处的值。


如果已定义,则显示为
无法正确测试对象是否存在。我有什么遗漏吗

如果您检查
定义的内容(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
如果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]

检查值是否为nil。检查您的条件:
defined?如果foo[100]和foo[0],那么foo[100]#=>“方法”
。是一个吗?Numeric
不是一个健壮的语句,因为它在
foo.size>100
foo[100]=>nil
时不起作用。您可能会争辩说,
foo
的任何元素在这里都不会被设置为
nil
,但是如果(i nil。好吧,这很有意义,为什么不管值是什么,它总是正确的。进行此验证的最佳方法是什么?比如说,如果我想调用一个方法,其中foo_at_zero会在分配给值之前检查这些条件?不确定我是否正确理解您,如果我错了,请更正我,您想将其放在下面吗方法中的代码,该方法进行这些验证并在0处返回适当的foo_值?是的。我很难创建一个方法,其中before赋值为变量,它检查!=nil和ia?数值。否则,赋值为“N/a”,如果
foo=Array.new(101){0};foo[100]=nil