Ruby鞋子:计算一个值在数组中出现的次数

3
我正在使用Shoes和Ruby制作Yahtzee游戏。当我点击“Two”按钮时,代码应该计算数组中值为2的出现次数。每出现一次值为2的情况,分数就会增加2分。
这段代码在某些情况下可以正常工作,但在其他情况下(例如@array = [2,1,2,2,3]),数组中有三个2,所以得分应该是6,但我的代码返回的结果却是4……为什么呢?
button "      twos     " do     
    @array.each_with_index do |value, index|
        if (@array[index] == 2)
            @score = @score + 2
            @points = @score + 2
        end #if     
end #loop end #button

那些美元符号是什么意思? - Flexoid
哦,我是这个网站的新用户,那只是一个格式错误。 - user1391983
2个回答

6

这段代码看起来更好,但实际上它做的是同样的事情。也许你应该检查实例变量 @score@points 的初始值?

@array = [2,1,2,2,3]

@score = @points = 0

@score = @array.count(2) * 2
@points = @score

@score
 => 6 
@points
 => 6

我尝试了这段代码,当我到达@array = [2,4,2,2,4]时,它给了我一个得分为2-,这可能是为什么? - user1391983
如果你在一个干净的环境中(例如irb)尝试这段代码,它会返回6。所以我认为问题出在你没有展示的代码部分。顺便说一句,现在代码看起来更好了) - Flexoid
除了使用标题打印分数之外,我在与@score相关的所有代码都与您的相同,当我打印数组时,它会打印出正确的数组。谢谢您的帮助!非常感激! - user1391983
1
我认为如果你制作一个轻量级版本的程序,只包括计算和打印分数所需的代码,然后检查它的运行情况,可能会有所帮助。 - Flexoid
你确定这些对象是相等的吗?我的意思是,有些2可能是“2”吗?请检查所有元素,并检查是否为puts“#{@array [index]}:#{@array [index] == 2}”。 - ayckoster

0

我建议您使用Enumerable#inject方法。通过inject,您可以实现抽象方法来计算数字,并在项目中的任何地方使用它:

def count_of_element array, element
  array.inject(0) { |count, e| count += 1 if e == element; count }
end

puts count_of_element [2,1,2,2,3], 2 # => 3

可能还有更好的解决方案 - 定义Array类的方法如下:

class Array
  def count_of_element element
    inject(0) { |count, e| count += 1 if e == element; count }
  end
end

puts [2,1,2,2,3].count_of_element 2 # => 3

看起来更酷了。祝你好运!


嘿,正如你从Flexoid的解决方案中所看到的那样,count方法已经存在了,没有必要再重新定义一个。 - Mischa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接