'散列#键'在帮手

时间:2018-02-13 16:59:01

标签: ruby

我在帮手中有这个方法:

def get_hash_keys(hash)
  hash.delete_if{|k, v| v.class != Hash}
  return hash.keys
end

当我从同一帮助器中的另一个方法调用get_hash_keys时,它返回一个空白数组:

def datas_size
  sum = 0
  new_hash = {title: "This is a test", datas: {firstname: "foo", lastname: "bar"}}
  new_hash.each do |k, v|
    sum += v.size if get_hash_keys(new_hash).includes? k
  end

  return sum
end

我测试过使用固定数组更改return hash.keys,我明白了。只有keys功能似乎不起作用。我还用params检查了我的数组。

我是否忽略了在助手内部工作的一些规范?

编辑@DRSE:

我从包含其他哈希的哈希开始。我需要知道每个孩子哈希的大小。关键是当我从视图中调用此函数(get_hash_keys)时,它会失败(返回空白数组),但是从控制台起作用(返回键)。

今天早上的更多调查让我得出结论,这可能是对delete_if的错误用法。我不明白的解决方案是取代:

def get_hash_keys(hash)
  hash.delete_if{|k, v| v.class != Hash}
  return hash.keys
end

def get_hash_keys(hash)
  tmp_hash = hash.clone
  tmp_hash.delete_if{|k, v| v.class != Hash}
  return tmp_hash.keys
end

2 个答案:

答案 0 :(得分:0)

hash.keys没有错:

def get_new_keys(hash)
  hash.delete_if{|k,v| k == :bar}
  return hash.keys
end
get_new_keys({qux: :bar, bar: :baz}) # => [:qux] 
另一方面,这是被破坏的。

def display_keys(hash)
  return "foo " + get_new_keys(hash)
end     

您是否希望退回array?如果是这样的话,根本就没办法解决这个问题。你可以做类似的事情:

def display_keys(hash)
  return [:foo].concat(get_new_keys(hash))
end

在这种情况下,它会执行以下操作:

def display_keys(hash)
  return [:foo].concat(get_new_keys(hash))
end
display_keys({qux: :bar, bar: :baz}) # => [:foo, :qux] 

答案 1 :(得分:0)

.keys方法返回哈希中的键和数组。

您的问题无法回答有两个原因:

  1. 您尚未在delete_if区块中包含该条件。我的 猜测是你要删除散列中的所有键,所以.keys是 返回[]
  2. 您尚未描述您期望的输出。
  3. 另外,您的方法display_keys在ruby 2.3中不起作用。您不能像这样连接数组和字符串。它将抛出TypeError: no implicit conversion of Array into String

    但是我最好的猜测下面的代码就可以了:

    def get_new_keys(hash)
        hash.delete_if{ |k,v| v % 2 == 0 }
        return hash.keys
    end
    
    def display_keys(hash)
        return ["foo"] + get_new_keys(hash)
    end
    
    hash = {
        one: 1,
        two: 2,
        three: 3,
        four: 4,
        five: 5,
        six: 6,
        seven: 7,
        eight: 8,
        nine: 9,
        ten: 10
    }
    

    输出:     

    pry(main)> display_keys( hash )
    => ["foo", :one, :three, :five, :seven, :nine]