10

从可能有值或没有值的哈希中提取时,我试图避免出现错误消息。我要么希望它返回值,要么返回 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

我认为这会起作用,但事实并非如此。我还能如何返回 anil而不是错误?

此外,内容字段本身也可能nil如此调用content['en']throws:

undefined method `content' for nil:NilClass
4

4 回答 4

24

如果你需要允许object.content.nil?,那么你会使用try. 如果您想允许丢失密钥,那么您不想要fetch(如Priti 注释),您需要正常[]方法。结合两个产量:

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)如果:[]看起来它在嘲笑你,你也可以使用它。

于 2013-06-29T17:19:51.230 回答
10

查看哈希#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
于 2013-06-29T16:57:44.453 回答
3

只需使用普通索引:

content['en'] #=> nil
于 2013-06-29T16:56:14.423 回答
2

从 Ruby 2.0 开始,try在可能的nil散列上使用并不整洁。您可以使用NilClass#to_h. 而nil在没有钥匙的情况下返回,这正是[]它的用途,而不是什么fetch用途。

@object.content.to_h["en"]
于 2013-06-29T18:28:02.320 回答