我必须在Ruby中清理一个对象,而我一直在做的方法是克隆哈希并修改原始文件。这是我原来的方法:
def remove_empty_stories(content)
content.clone.each do |section,stories|
for i in 0...stories.length do
if stories[i].length < 25
content[section].delete_at(i)
end
end
end
content
end
但是我曾经想过,从旧哈希中用可接受的值构建一个新哈希是一个更好的主意。这是正确的假设吗?
我是否正确地认为这将是一种“功能性”风格?
以前可能的内容示例:
content = {
:GENERAL_STORIES => [
'Story 1',
'Story 2',
'',
'Story 3',
etc,
],
:GOLD_STORIES => [
'Story 1',
'Story 2',
'Story 3',
'',
'',
etc
],
etc.
}
我在上面的方法中发现的是,如果我删除一个故事,那么它会缩短数组,但迭代器仍然会计入原始长度(我得到的错误是.length不能应用于nil或者某些东西)
答案 0 :(得分:1)
是的,这将是一个更好的主意。考虑当不同类的多个实例使用此哈希时的情况。当其中一个实例修改哈希时,更改会对其余实例产生影响。后来很难调试为什么有些东西不起作用。
def without_empty_stories(content)
content.inject({}) do |memo, section, stories|
memo[section] = stories.select { |s| s.length >= 25 }
memo
end
end
P.S。我现在在Windows上 - 如果引入任何语法错误,则发送
答案 1 :(得分:1)
您可以使用delete_if方法。由于您不会更改内容大小,只需更改故事大小,因此您无需克隆内容。
List(Branch(1,Vector(2, 3)), Branch(2,Vector(4, 5)), Leaf(3), Leaf(4), Branch(5,Vector(6, 7)))