如何使三元语句在for循环中工作?

时间:2014-03-28 20:54:30

标签: ruby

如果可以被4整除,我想将天数加到366,如果不是则可以加365。为什么

amountOfDays = 0
for i in 0..100
    i % 4 == 0 ? amountOfdays += 366 :  amountOfdays += 365
end

不行吗?它说undefined method + for nil:NilClass

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:3)

因为您没有定义amountOfDays = 0amountOfdays = 0。两者都是不同的变量。可能是错字。在所有情况下使用其中的任何一个。

喜欢

amountOfdays = 0
for i in 0..100
    (i % 4 == 0) ? amountOfdays += 366 :  amountOfdays += 365
end

正确命名将使用Ruby - amount_of_days而不是amountOfdays。或者语法上更有声音number_of_days

以更多Ruby方式 -

number_of_days = (0..100).reduce(0) { |tot,i| tot + ((i%4 == 0) ? 366 : 365) } 
#=> 36891

答案 1 :(得分:1)

您的代码中存在拼写错误。在顶部设置amountOfDays(大写字母D),然后使用amountOfdays。 Ruby将变量初始化为nil,因为它被分配给(是的,在这种情况下它有点奇怪)。例如:

a += 10
# NoMethodError: undefined method `+' for nil:NilClass

而不是

a + 10
# NameError: undefined local variable or method `a' for main:Object

哪种诊断会更容易。

此外,您使用(i % 4)表达式,因为它返回了一个布尔值,但它返回一个数字。在ruby中,除falsenil之外的所有内容都评估为true("真实的",实际上),因此您的情况永远不会错误。

最后,由于您使用的是三元组,因此您可以使用它们是表达式的事实:

amountOfDays = 0
for i in 0..100
  amountOfDays += (i % 4) == 0 ? 366 : 365
end

并且,如果你想要更加惯用(在ruby中使用for循环非常罕见):

amount_of_days = (0..100).map { |year| year % 4 == 0 ? 366 : 365 }.reduce(:+)