Ruby Koans评分项目。 nil的未定义方法`length':NilClass

时间:2011-09-20 18:13:33

标签: ruby nomethoderror

我是Ruby的新手,也是一般的编程。我正在通过Ruby Koans工作。在卡住之前我已经达到了176/274 这是“得分项目”我需要写一个方法来计算给定骰子的得分 这可能不是你见过的最优雅的代码,但这就是我想出的:

def score(dice)
  tally = 0
  tally += (dice.sort.to_s[/[1]+/].length % 3) * 100
  if dice.sort.to_s[/[1]+/].length >= 3
    tally += 1000
  end
  tally = tally + (dice.sort.to_s[/[5]+/].length % 3) * 50
  if dice.sort.to_s[/[5]+/].length >= 3
    tally += 500
  end
  if dice.sort.to_s[/[2]+/].length >= 3
    tally += 200
  end
  if dice.sort.to_s[/[3]+/].length >= 3
    tally += 300
  end
  if dice.sort.to_s[/[4]+/].length >= 3
    tally += 400
  end
  if dice.sort.to_s[/[6]+/].length >= 3
    tally += 600
  end
  return tally
end

第一个测试是:得分([])需要返回0

当我运行它时,我得到“未定义的方法`长度'为nil:NilClass”(引用的行是.length的第一个实例) 这告诉我“dice.sort.to_s [/ [1] + /]”和“得分([])”是零,但是当我在irb>>中运行它时它是0。

是什么给出了?

2 个答案:

答案 0 :(得分:0)

您使用的是什么Ruby版本?我正在使用1.9.2并且我的IRB给了我相同的错误,因为如果没有匹配,正则表达式返回nil。 作为dice = []边框大小写,您可以在代码的第一行添加一个检查,以便返回0。

我今天做了RubyKoans,尽管如此,我的代码并不比你的代码漂亮,也许它会帮助你一点点:

def score(dice)

points = 0
dice.sort!
  nmbrs = Array.new
       dice.each { |n|
               nmbrs[n] = dice.select { |nm| nm == n}
       } 

 n = 0
 nmbrs.each { |vals|
      n = n + 1
      if(vals.nil?)
              next
      end
      if(vals.count >= 3)

              points += (n-1)*100 if (n-1) != 1
              points += 1000 if (n-1) == 1

              if vals.size > 3
                      if (n-1) == 1
                              points += 100 * (vals.size - 3)
                      else
                              if (n-1) == 5
                                      points += 50 * (vals.size - 3)
                            end
                      end

              end
      else
            points += 100 * (vals.count) if (n-1) == 1
            points += 50 * (vals.count) if (n-1) == 5
      end
   }

    points

 end

对于糟糕的功能感到抱歉,但它确实有效,因此它可能会让您了解如何解决该特定问题。

祝你好运!

答案 1 :(得分:0)

行。明白了。

巨大的道歉,我曾说过,运行“dice.sort.to_s [/ [1] + /]”返回零而不是零,它一定是因为它有一些我不知道的值。当我运行“[] .sort.to_s [/ [1] + /]时,它正确地返回了nil。因此,我在检查中嵌套了每个if语句,以确保没有nil值。

def score(dice)
  tally = 0
  if dice.sort.to_s[/[1]+/]
    tally += (dice.sort.to_s[/[1]+/].length % 3) * 100
    if dice.sort.to_s[/[1]+/].length >= 3
      tally += 1000
    end
  end
  if dice.sort.to_s[/[5]+/]
    tally += (dice.sort.to_s[/[5]+/].length % 3) * 50
    if dice.sort.to_s[/[5]+/].length >= 3
      tally += 500
    end
  end
  if dice.sort.to_s[/[2]+/]
    if dice.sort.to_s[/[2]+/].length >= 3
      tally += 200
    end
  end
  if dice.sort.to_s[/[3]+/]
    if dice.sort.to_s[/[3]+/].length >= 3
      tally += 300
    end
  end
  if dice.sort.to_s[/[4]+/]
    if dice.sort.to_s[/[4]+/].length >= 3
      tally += 400
    end
  end
  if dice.sort.to_s[/[6]+/]
    if dice.sort.to_s[/[6]+/].length >= 3
      tally += 600
    end
  end
  return tally
end

所有测试通过。