我正试图这样做:
def ArithGeo(arr)
if arr[2]/arr[1] == arr[3]/arr[2]
return "Geometric"
else
return "Arithmetic"
end
end
print ArithGeo(STDIN.gets)
当我在终端中运行时,它返回第2行有一个“未定义的方法”。
为什么呢?使用[1,2,3,100]
进行测试时,该数组是所有数字。 (是的,我知道,如果不是,我将返回“算术”。我还没有达到那个部分。)
另外,to_i
是否必要?如果数组中的项已被视为整数,则它们是整数,对吧?我还尝试在每个数组项上使用to_i
但是它返回了“除以零”错误,即使数组中的所有项都不是0,并且我没有使用位置0。
答案 0 :(得分:1)
arr
中的一个(或多个)元素是String
。
irb(main):009:0> "string"/"another string"
NoMethodError: undefined method `/' for "string":String
当您在to_i
上致电String
时,它会变为0。
irb(main):013:0* "string".to_i
=> 0
当你除以0时会出现错误,因为你不能这样做。
irb(main):011:0> "string".to_i/"another string".to_i
ZeroDivisionError: divided by 0
您可以通过更改此行来修复您的代码:
print ArithGeo(STDIN.gets)
到此:
print ArithGeo(STDIN.gets.strip.split(',').map(&:to_i))
然后输入您的输入:
1,2,3,100 # don't include the "[]" around the numbers
答案 1 :(得分:1)
由于你输入的是ruby语法[1,2,3,100],你需要对它进行评估。
GetDeviceCaps
输入:
def ArithGeo(arr)
puts "#{arr.class} , #{arr}"
if arr[2]/arr[1] == arr[3]/arr[2]
return "Geometric"
else
return "Arithmetic"
end
end
puts ArithGeo(eval STDIN.gets )
结果:
[1, 2, 3, 100]
另外,我建议使用浮点数来防止整数舍入。
Array , [1, 2, 3, 100]
Arithmetic
编辑:
使用更好(更安全+更通用):
if arr[2].to_f/arr[1] == arr[3].to_f/arr[2]
例如:
JSON.parse( array_string )
如果你真的想要安全起见,你需要为JSON解析错误添加异常处理。
答案 2 :(得分:0)
这取决于您的arr
元素。比如,如果arr
元素是字符串,那么您将获得undefined method '/' for String (NoMethodError)
。
您需要确保您的arr
元素是实现除法(/
)方法的数字,即整数或浮点数等。
您可以输入逗号分隔的值,并使用String#split方法将该字符串转换为数组,如我在评论中所述:
def ArithGeo(str)
arr = str.split(',').map(&:to_i) # split the values by comma and make them integer and put in array arr
# then you can use the following beause now your arr is an array, make sure you have at least 4 elements as you
# used index 3 in the calculation
if arr[2]/arr[1] == arr[3]/arr[2]
return "Geometric"
else
return "Arithmetic"
end
end
print ArithGeo(STDIN.gets)
答案 3 :(得分:0)
当你真正想要的是一个整数数组时,你将一个String传递给你的方法(IO.gets
returns a string)。如果您只传入此字符串,您会发现没有为字符串定义除法。如果您尝试首先将输入转换为整数,则任何前导非数字字符都将导致字符串转换为0.
尝试
arr = STDIN.gets.split(', ').map(&:to_i)
ArithGeo(arr)