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

hol*_*den 10 ruby ruby-on-rails ruby-on-rails-4

我正在尝试避免从可能有或没有值的哈希中提取错误消息.我想要它返回值或返回nil.

我认为该try方法会这样做,但我仍然会收到错误.

key not found: "en"
Run Code Online (Sandbox Code Playgroud)

我的哈希是一个名为content... content['en']等的hstore列.

content = {"es"=>"This is an amazing event!!!!!", "pl"=>"Gonna be crap!"}
Run Code Online (Sandbox Code Playgroud)

试试方法

@object.content.try(:fetch, 'en') # should return nil, but errors even with try method
Run Code Online (Sandbox Code Playgroud)

我认为这会奏效,但事实并非如此.我怎样才能返回nil而不是错误?

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

undefined method `content' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 22

如果您需要允许object.content.nil?,那么您可以使用try.如果你想允许丢失密钥然后你不想要fetch(正如Priti所说),你想要正常的[]方法.结合两种产量:

object.content.try(:[], 'en')
Run Code Online (Sandbox Code Playgroud)

注意:

> h = { :a => :b }
 => {:a=>:b} 
> h.try(:[], :a)
 => :b 
> h.try(:[], :c)
 => nil 
> h = nil
 => nil 
> h.try(:[], :a)
 => nil
Run Code Online (Sandbox Code Playgroud)

object.content.try(:fetch, 'en', nil)如果:[]它看起来像是在嘲笑你,你也可以使用它.

  • *你也可以使用`object.content.try(:fetch,'en',nil)`如果`:[]`看起来好像在嘲笑你.* - 我喜欢你的这个陈述..`Hash #fetch`,我最喜欢的方法.. :)) (2认同)

Aru*_*hit 9

请参阅Hash #fetch

返回给定键的哈希值.如果找不到密钥,则有几个选项:如果没有其他参数,则会引发KeyError异常 ; 如果给出了默认值,那么将返回; 如果指定了可选代码块,那么将运行该代码块并返回其结果.

h = { "a" => 100, "b" => 200 }
h.fetch("z")
# ~> -:17:in `fetch': key not found: "z" (KeyError)
Run Code Online (Sandbox Code Playgroud)

所以使用:

h = { "a" => 100, "b" => 200 }
h.fetch("z",nil)
# => nil
h.fetch("a",nil)
# => 100
Run Code Online (Sandbox Code Playgroud)