修改Ruby哈希的语义正确方法 - 一种功能方法?

时间:2015-05-16 15:22:13

标签: ruby hash functional-programming

我必须在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或者某些东西)

2 个答案:

答案 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)))