1

我正在尝试创建一个$player[:abil_mods]基于我的哈希的新$player[:abils]哈希。它应该取每个值,减去 10,除以 2,并将其分配给新哈希中的相同键。但是,它似乎没有编辑$player[:abil_mods].

我的代码:

$player = {
  abils: {str: 20, con: 20, dex: 14, wis: 12, int: 8, cha: 8},
  abil_mods: {}
}

$player[:abil_mods] = $player[:abils].each { |abil, pts| ((pts - 10) / 2).floor }

应该创建以下$player[:abil_mods]哈希:

abil_mods: {str: 5, con: 5, dex: 2, wis: 1, int: -1, cha: -1}

但它正在创建:

abil_mods: {str: 20, con: 20, dex: 14, wis: 12, int: 8, cha: 8}
4

3 回答 3

2

我很确定会#each返回它正在操作的哈希值。(至少这就是它在数组上的工作方式......)更多的是对每个条目做一些事情,而不是返回那个东西的结果。

您可以尝试:

$player[:abil_mods] = $player[:abils].transform_values { |pts| ((pts - 10) / 2).floor }
于 2019-11-16T14:38:56.227 回答
1

只需在这一行中使用map而不是:each

$player[:abil_mods] = $player[:abils].map { |abil, pts| ((pts - 10) / 2).floor }

each遍历数组但返回原始数组。而map返回新值。

顺便说一句:使用全局变量(带有 的那个$)几乎每次都是一个坏主意。最好使用局部变量的实例。

于 2019-11-16T14:37:20.703 回答
1

问题是在行

$player[:abil_mods] = $player[:abils].each { |abil, pts| ((pts - 10) / 2).floor }

您正在将方法的返回值分配给Hash#eachkey处self的 Hash 。在您的情况下,哈希由.$player:abil_mods$player[:abils]

您可以使用Enumerable#mapwhich 返回一个可以轻松转换为哈希的数组:

$player[:abil_mods] = $player[:abils].map { |k, pts| [k,  ((pts - 10) / 2).floor] }.to_h
于 2019-11-16T14:37:49.823 回答