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
?