除法: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)