Division:Ruby没有方法错误

时间:2015-12-16 17:55:06

标签: ruby division nomethoderror

我正试图这样做:

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。

4 个答案:

答案 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)