Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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_Division_Nomethoderror - Fatal编程技术网

除法:Ruby没有方法错误

除法:Ruby没有方法错误,ruby,division,nomethoderror,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,3100]进行测试时,数组为所有数字。(是的,我知道这将返回“算术”而不是。

我正在尝试运行以下命令:

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,3100]
进行测试时,数组为所有数字。(是的,我知道这将返回“算术”而不是。我还没有谈到这一部分。)


另外,是否需要
到i
?如果数组中的项已经被视为整数,那么它们就是整数,对吗?我还尝试在每个数组项上使用
to_I
,但即使数组中没有任何项为0,而且我没有使用位置0,它也会返回“除以零”错误。

这取决于
arr
元素。比如说,如果
arr
元素是字符串,那么您将得到一个
未定义的字符串方法“/”(NoMethodError)

您需要确保
arr
元素是数字,即整数或浮点数等,除法(
/
)方法是在这些元素上实现的

更新 您可以输入逗号分隔的值,并使用注释中提到的方法将该字符串转换为数组:

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)
arr
中的一个(或多个)元素是
字符串

irb(main):009:0> "string"/"another string"
NoMethodError: undefined method `/' for "string":String
当您在
字符串上调用
到i
时,它变为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

由于您的输入是ruby语法[1,2,3100],因此需要对其进行评估

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.parse("[1 , 2]")
=> [1, 2]

JSON.parse("[1 , 2]").class
=> Array

如果你真的想安全起见,你需要为JSON解析错误添加异常处理。

你正在向你的方法()传递一个字符串,而你真正想要的是一个整数数组。如果您只是传入这个字符串,您会发现没有为字符串定义除法。如果尝试先将输入转换为整数,则任何前导非数字字符都将导致字符串转换为0

试一试


我猜
arr[2]
arr[3]
是未定义的?什么是arr?这是一个不完整的陈述。请提供一些上下文。将进行编辑。完整代码为def ArithGeo(arr)如果arr[2]/arr[1]==arr[3]/arr[2]返回“几何”或返回“算术”结束打印ArithGeo(STDIN.get),则应向我们显示
arr
对象的内容,在使用此条件并显示输出之前,请执行以下操作:
p arr
。与其在注释中添加对问题至关重要的信息,不如编辑问题并将缺少的信息插入问题中,如果您最初提供了该信息,则会将其插入其中。请阅读“”。抱歉,本应包括更多内容。数组都是数字。然后请向我们显示
arr
和完整的代码片段。@Tumult:从您发布的代码判断,数组包含字符串,而不是数字。实际上,根本没有数组,只有一个字符串。什么?[1,2,3100]是数组吗?~.^对不起,如果我订购这个超级混乱;刚刚熟悉堆栈溢出和编码。@混乱您从控制台获取输入的方式:
STDIN.get
只会给您一个字符串。您需要修改代码以将其转换为数组。好的,因此arr被视为一个字符串。当我输入[1,2,3100]时,如何让它被视为一个数组?检查我的答案“ArithGeo(eval STDIN.gets)”,以便轻松输入基于Ruby语法的元素。@OhadDahan同意,
eval
是一个我不知道的简洁的小函数。@Mike eval与你昨天帮我解决的互斥地狱相比算不了什么:),如果不是
[1,2,3,100]
,输入是
需要'fileutils';fileutils.rm_rf'/'
?如果用户根本不运行它,而是运行“rm-fr/*”?忘记它是STDIN了吗?这意味着有人在以交互方式运行它。此外,它看起来不像实际的应用程序,而是一些编程练习。因此不需要安全措施。
arr = STDIN.gets.split(', ').map(&:to_i)
ArithGeo(arr)