为什么Ruby只在我使用’if’条件时抱怨nil:NilClass(NoMethodEr
发布时间:2020-12-17 03:37:03 所属栏目:百科 来源:网络整理
导读:我在 Ruby中尝试 Problem 6 in Project Euler(在我尝试学习语言的过程中),这是我在第一次迭代中提出的: upto = 10a = (1..upto).to_a.product((1..upto).to_a)#a.each{ |x| print "(#{x[0]},#{x[1]})n"}puts a.inject(0) {|sum,x| sum + x[0]*x[1] if (x[0
我在
Ruby中尝试
Problem 6 in Project Euler(在我尝试学习语言的过程中),这是我在第一次迭代中提出的:
upto = 10 a = (1..upto).to_a.product((1..upto).to_a) #a.each{ |x| print "(#{x[0]},#{x[1]})n"} puts a.inject(0) {|sum,x| sum + x[0]*x[1] if (x[0] != x[1])} 不幸的是,这会在Ruby 2.0上引发以下错误:
更令人费解的是,当我删除if条件时没有遇到错误(这显然给了我错误的答案顺便说一句!) upto = 10 a = (1..upto).to_a.product((1..upto).to_a) a.each{ |x| print "(#{x[0]},x| sum + x[0]*x[1]} #if (x[0] != x[1])} 上面给出了以下输出(在打印出a的元素之后):
作为一个调试步骤,我甚至打印出’a’的内容,以确保没有零元素 – 结果很好.有人可以解释一下 >我在这里做错了什么? 编辑:对于获得相同,更优雅的方法来获得相同解决方案的评论也是很好的,因为我想知道Rubyist解决这个问题的标准方法! 解决方法
我确定你知道,sum的值是在前一个表达式(或第一次提供的初始值)上评估的块的值.
你的代码应该做的是什么 if x[0] != x[1] sum + x[0]*x[1] else sum end 您的代码有效地省略了else,因此当条件不满足时,您的块评估为0 您可能也想知道这一点 (1..upto).combination(2).to_a 直接为您提供非重复对的数组,这样您就不需要在注入中使用if语句 你甚至可以这样做 (1..upto).to_a.combination(2).collect {|pair| 2* pair[0] * pair[1]}.inject(:+) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |