我正在尝试避免从可能有或没有值的哈希中提取错误消息。我想要它返回值或返回nil。
我认为try
方法会这样做,但我仍然会收到错误。
key not found: "en"
我的哈希是一个名为content
... content['en']
等的hstore列。
content = {"es"=>"This is an amazing event!!!!!", "pl"=>"Gonna be crap!"}
尝试方法
@object.content.try(:fetch, 'en') # should return nil, but errors even with try method
我认为这样可行,但事实并非如此。我怎样才能返回nil
而不是错误?
此外,内容字段本身也可能是nil
,因此调用content['en']
会抛出:
undefined method `content' for nil:NilClass
答案 0 :(得分:22)
如果您需要允许object.content.nil?
,那么您将使用try
。如果您想允许丢失密钥,那么您不希望fetch
(作为Priti notes),您需要正常的[]
方法。结合两种产量:
object.content.try(:[], 'en')
观察:
> h = { :a => :b }
=> {:a=>:b}
> h.try(:[], :a)
=> :b
> h.try(:[], :c)
=> nil
> h = nil
=> nil
> h.try(:[], :a)
=> nil
如果object.content.try(:fetch, 'en', nil)
看起来像是在嘲笑你,你也可以使用:[]
。
答案 1 :(得分:9)
请参阅Hash#fetch
从给定键的哈希值返回一个值。如果找不到密钥,有几个选项:没有其他参数, 会引发KeyError异常 ;如果给出了默认值,那么将返回;如果指定了可选代码块,那么将运行该代码块并返回其结果。
h = { "a" => 100, "b" => 200 }
h.fetch("z")
# ~> -:17:in `fetch': key not found: "z" (KeyError)
所以使用:
h = { "a" => 100, "b" => 200 }
h.fetch("z",nil)
# => nil
h.fetch("a",nil)
# => 100
答案 2 :(得分:3)
只需使用普通索引:
content['en'] #=> nil
答案 3 :(得分:2)
从Ruby 2.0开始,在可能的try
哈希上使用nil
并不整洁。您可以使用NilClass#to_h
。如果没有密钥则返回nil
,这正是[]
的用途,而不是fetch
的用途。
@object.content.to_h["en"]