尝试获取哈希值时的`try`方法

时间:2013-06-29 16:54:56

标签: ruby-on-rails ruby ruby-on-rails-4

我正在尝试避免从可能有或没有值的哈希中提取错误消息。我想要它返回值或返回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

4 个答案:

答案 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"]