【发布时间】:2014-03-23 06:53:30
【问题描述】:
似乎无法弄清楚这一点。请帮助我了解此代码对 a 变量的要求以及预期的输出应该是什么。提前致谢!
def function_name(a)
a.inject({}){ |a,b| a[b] = a[b].to_i + 1; a}.\
reject{ |a,b| b == 1 }.keys
end
【问题讨论】:
似乎无法弄清楚这一点。请帮助我了解此代码对 a 变量的要求以及预期的输出应该是什么。提前致谢!
def function_name(a)
a.inject({}){ |a,b| a[b] = a[b].to_i + 1; a}.\
reject{ |a,b| b == 1 }.keys
end
【问题讨论】:
假设a是一个数组,
该函数首先计算键的出现次数。
a = ['a', 'b', 'c', 'b']
a.inject({}) { |a,b|
# a: a result hash, this is initially an empty hash (`{}` passed to inject)
# b: each element of the array.
a[b] = a[b].to_i + 1 # Increase count of the item
a # The return value of this block is used as `a` argument of the block
# in the next iteration.
}
# => {"a"=>1, "b"=>2, "c"=>1}
然后,它过滤多次出现的项目:
...reject{ |a,b|
# a: key of the hash entry, b: value of the hash entry (count)
b == 1 # entry that match this condition (occurred only once) is filtered out.
}.keys
# => ["b"]
因此,应该使用像 get_duplicated_items 这样的函数名称而不是 function_name 来更好地描述用途。
【讨论】:
." 我发现如果我不包括这个方法就会失败。
reject 返回一个哈希值。 .keys 仅用于获取哈希的键。 (.调用方法keys)
_i + 1; a}. 再次感谢您的帮助!
reject 方法也是如此。尾随反斜杠 (\ ) 用于续行。
它希望 a 成为一个数组,但数组由什么组成似乎并不重要,因此您需要一些其他线索来了解数组中应该包含什么。
代码所做的是相当直接的前言。对于数组中的每个项目,它都将其用作散列中的键。然后它基本上计算它看到该密钥的次数。最后,它会删除所有只出现一次的项目。
它返回数组 a 中出现 2 次或更多次的唯一项。
【讨论】: