修改 Ruby 哈希的语义正确方法 - 一种功能方法?
Semantically correct way to modify a Ruby hash - a functional approach?
我必须清理 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
但我有一个想法,最好是从旧散列的可接受值中构建一个新散列。这是一个正确的假设吗?
我认为这是 'functional' 风格对吗?
之前的内容示例:
content = {
:GENERAL_STORIES => [
'Story 1',
'Story 2',
'',
'Story 3',
etc,
],
:GOLD_STORIES => [
'Story 1',
'Story 2',
'Story 3',
'',
'',
etc
],
etc.
}
我用上面的方法发现,如果我删除一个故事,它会缩短数组,但迭代器仍然计数到原始长度(我得到的错误是 .length 不能应用于 nil或其他)
是的,这会是个更好的主意。考虑当此散列被不同 类 的多个实例使用时的情况。当其中一个实例修改散列时,更改会对其余实例产生影响。后来很难调试为什么有些东西不起作用。
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 - 如果出现任何语法错误,请见谅
您可以使用delete_if方法。因为你不改变内容大小,只改变故事大小,所以你不需要克隆内容。
def remove_empty_stories(content)
content.each do |section,stories|
stories.delete_if { |e| e.length < 25 }
end
end
我必须清理 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
但我有一个想法,最好是从旧散列的可接受值中构建一个新散列。这是一个正确的假设吗?
我认为这是 'functional' 风格对吗?
之前的内容示例:
content = {
:GENERAL_STORIES => [
'Story 1',
'Story 2',
'',
'Story 3',
etc,
],
:GOLD_STORIES => [
'Story 1',
'Story 2',
'Story 3',
'',
'',
etc
],
etc.
}
我用上面的方法发现,如果我删除一个故事,它会缩短数组,但迭代器仍然计数到原始长度(我得到的错误是 .length 不能应用于 nil或其他)
是的,这会是个更好的主意。考虑当此散列被不同 类 的多个实例使用时的情况。当其中一个实例修改散列时,更改会对其余实例产生影响。后来很难调试为什么有些东西不起作用。
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 - 如果出现任何语法错误,请见谅
您可以使用delete_if方法。因为你不改变内容大小,只改变故事大小,所以你不需要克隆内容。
def remove_empty_stories(content)
content.each do |section,stories|
stories.delete_if { |e| e.length < 25 }
end
end