gpt4 book ai didi

ruby-on-rails - ruby 大于符号得到nomethoderror

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:21 25 4
gpt4 key购买 nike

我用 Ruby 编写了以下代码,但一直收到 NoMethodError: undefined method '>' for nil:NilClass。不确定为什么它认为 > 是一种方法?

def count_positives_sum_negatives(lst)
pos = 0
neg = 0
for i in 0..lst.length
if lst[i] > 0
pos += 1
elsif lst[i] < 0
neg += 1
end
end
return [pos, neg]
end

最佳答案

当我这样说时,我并不是在假装自己是 Ruby 大师。请不要误解我的意思。我只是在重复几年前我开始使用 Ruby 时听到的一句话:学习 Ruby 不仅仅是使用 Ruby 语法。人们需要探索 Ruby 核心并尝试以 Ruby 的方式做事。

这正是这里发生的事情。问题中显示的代码与 Ruby 方式相去甚远。还有@manonthemat 给出的答案中的代码。

它可以缩短为:

def count_positives_sum_negatives(lst)
result = [0,0]
lst.each { |el| (el > 0 ) ? result[0] += 1 : result[1] += 1 }
result
end

或者更好:

def count_positives_sum_negatives(lst)
lst.each_with_object([0,0]) { |el,arr| (el > 0) ? arr[0] += 1 : arr[1] += 1 }
end

在这两种情况下,运行

puts count_positives_sum_negatives([5,7,-1,-4,4,4,5,-3])

会导致

[5,3]

请注意,第二种形式使用 each_with_object,甚至比第一种更好。在外部声明数组或散列以在 block 内使用它被认为是 Ruby 中的代码味道。

我想指出方法的名称(count_positives_sum_negatives)不好。它不代表该方法的作用,因为该方法同时计算正数和负数,并且不对它们进行求和。当然 count_positives_and_negatives 会是一个更好的名字。

顺便说一句,@manonthemat 完全正确,他指出使用 each 比使用基于范围的索引迭代要好得多。如果确实需要 block 中的索引,可以使用 each_with_index 方法来提供它。

关于ruby-on-rails - ruby 大于符号得到nomethoderror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com