【发布时间】:2019-11-17 13:59:53
【问题描述】:
我正在制作一个简单的 RPG 作为一个学习项目,但我遇到了角色创建者的一部分问题。
此代码应确定分配给player[:caste][:skill] 和player[:sub][:skill] 的技能字符串,然后将player[:skills] 中每个相应技能的值增加2。无论分配给player[:caste][:skill] 和@ 的字符串如何,此代码都应该有效987654325@,只要等于player[:skills].to_s。
目前,它仅将更改应用于player[:skills][:endurance],而不是player[:skills][:athletics]。
player = {
caste: {skill: "athletics"},
sub: {skill: "endurance"},
skills: {acrobatics: 0, athletics: 0, engineering: 0, endurance: 0, heal: 0, history: 0, influence: 0, insight: 0, magicka: 0, perception: 0, riding: 0, stealth: 0, streetwise: 0, thievery: 0},
}
player[:skills] = player[:skills].map do |skill, mod|
[skill, (mod += 2 if skill.to_s == player[:caste][:skill])]
[skill, (mod += 2 if skill.to_s == player[:sub][:skill])]
end.to_h
换句话说,我的代码返回以下player[:skills] 哈希:
skills: {acrobatics: 0, athletics: 0, engineering: 0, endurance: 2, heal: 0, history: 0, influence: 0, insight: 0, magicka: 0, perception: 0, riding: 0, stealth: 0, streetwise: 0, thievery: 0}
但我希望它返回:
skills: {acrobatics: 0, athletics: 2, engineering: 0, endurance: 2, heal: 0, history: 0, influence: 0, insight: 0, magicka: 0, perception: 0, riding: 0, stealth: 0, streetwise: 0, thievery: 0}
如果有更简单的方法,请告诉我。我还尝试了以下方法:
player[:skills] = player[:skills].map do |skill, mod|
[skill, (mod += 2 if skill.to_s == (player[:caste][:skill] || player[:sub][:skill]))]
end.to_h
只影响player[:caste][:skill]中的技能。
【问题讨论】:
-
不相关,但将所有内容保存在哈希中可能不是最好的方法。将这样的行为封装到类中并避免散布在代码中的任意数量的条件可能是一个好主意。
-
谢谢,戴夫。我会牢记这一点。在这个项目中,我主要将数据存储在哈希和数组中,以便更好地使用它们。在未来的项目中,我将更多地关注类。
-
不要将尾随
if嵌入到数组中。很难破译你在做什么,如果测试失败会插入 nil 导致你以后必须防止的不一致的数据类型。