Ruby:如何使用 .each 遍历数组?

标签 ruby loops iteration block

在纸牌游戏桥牌中,四张牌被赋予点值:Jack:1,Queen:2,King:3,Ace:4。给定一手牌对应的字符串数组(纸牌表示如下: ["2","3","4","5","6","7","8","9","10","J","Q","K", "A"]), 返回该手牌的大牌总点数。

我可以用 while 循环解决这个简单的问题,但我也想学习如何使用 .each 遍历数组,这是我的代码那行不通

def high_card_points(hand)
  sum = 0
  hand.each do |i|
    if hand[i] == "J"
      sum += 1
    elsif hand[i] == "Q"
      sum += 2
    elsif hand[i] == "K"
      sum += 3
    elsif hand[i] == "A"
      sum += 4
    end
  end
  sum
end

现在,当我运行它时,出现错误 no implicit conversion of String into Integer。我应该如何以正确的方式去做?

最佳答案

这里的问题是,当你在 block 中使用每个变量时,数组中的对象不是索引,所以你可以按如下方式工作:

def high_card_points(hand)
  sum = 0
  hand.each do |card|
    if card == "J"
      sum += 1
    elsif card == "Q"
      sum += 2
    elsif card == "K"
      sum += 3
    elsif card == "A"
      sum += 4
    end
  end
  sum
end

如果你偷偷执行

[5] pry(main)* => :high_card_points
[6] pry(main)> high_card_points(cards)
=> 10

您也可以像使用 each_index 一样使用索引。但您也可以采用其他对象功能方法:

您可以创建您的类或猴子修补类字符串:

  class String
    def card_points
      case self
      when 'J'
        1
      when 'Q'
        2
      when 'K'
        3
      when 'A'
        4
      else
        0
      end
    end
  end

然后像这样进行:

[31] pry(main)> cards.map(&:card_points).inject(0, :+)
=> 10

关于Ruby:如何使用 .each 遍历数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52799965/

相关文章:

ruby - 无法找到 chromedriver 可执行文件

javascript - 将 Ruby SHA 转换为 javascript

ruby - 将记录的 created_by 字段检索到 Rails3 中传递的月份和年份?

python - 我应该如何在 Django 中按类别组织项目列表?

ios - 有什么方法可以在 swift 4 中迭代 double var 的小数部分吗?

java - 循环遍历枚举作为参数

ruby-on-rails - 给定一个 Model.title,如何最好地查询首字母 = X 的所有记录

json - 迭代 JavaScript JSON 对象 - Chrome/Opera 下一步反向 - FireFox/Safari OK

java - 无法显示循环中的所有字符

JavaScript E4X : How do I properly iterate over an attribute XMLList?