我有一个哈希数组,我想要它的唯一值.打电话Array.uniq给我的不是我的期望.
a = [{:a => 1},{:a => 2}, {:a => 1}]
a.uniq # => [{:a => 1}, {:a => 2}, {:a => 1}]
Run Code Online (Sandbox Code Playgroud)
我期望的地方:
[{:a => 1}, {:a => 2}]
Run Code Online (Sandbox Code Playgroud)
在网上搜索时,我没有想出一个我满意的解决方案.乡亲们建议重新界定Hash.eql?和Hash.hash,因为这是Array.uniq被查询.
编辑:在现实世界中遇到这个问题时,哈希值稍微复杂一些.它们是解析的JSON的结果,它具有多个字段,其中一些值也是哈希值.我有一系列的结果,我想过滤掉唯一的值.
我不喜欢重新定义Hash.eql?和Hash.hash解决方案,因为我要么Hash全局重新定义,要么为我的数组中的每个条目重新定义它.更改Hash每个条目的定义会很麻烦,尤其是因为每个条目中可能存在嵌套的哈希值.
Hash全球变化有一定的潜力,特别是如果它是暂时完成的话.我想构建另一个类或辅助函数来包装保存旧的定义并恢复它们,但我认为这会增加实际需要的复杂性.
使用inject似乎是重新定义的一个很好的选择Hash.
我的客户端使用Access作为SQL Server数据库的前端.他们最近在运行一些报告时不时开始收到ODBC-3146错误.据我所知,这只是一个通用的ODBC调用失败错误.
我已经尝试在启动报告的VB脚本中坚持一些错误处理,但我没有运气获得额外的错误信息.
代码看起来有点像这样.
Public Function RunReports()
On Error GoTo MyErrorTrap
DoCmd.OpenReport "blah", acViewPreview
DoCmd.Close
DoCmd.OpenReport "foo", acViewPreview
DoCmd.Close
Exit_function:
Exit Function
MyErrorTrap:
Dim errX As DAO.Error
Dim MyError As Error
If Errors.Count > 1 'This always seems to be 0, so no help
For Each errX In DAO.Errors 'These are empty even if dont check for Errors.Count
Debug.Print "ODBC Error"
Debug.Print errX.Number
Debug.Print errX.Description
Next errX
Else
Debug.Print "VBA Error"
Debug.Print Err.Number
Debug.Print Err.Description
End If
'Also have tried …Run Code Online (Sandbox Code Playgroud)