在Rails中,如果不存在值以避免错误,我们可以执行以下操作:
@myvar = @comment.try(:body)
Run Code Online (Sandbox Code Playgroud)
当我深入挖掘哈希并且不想得到错误时,等价物是什么?
@myvar = session[:comments][@comment.id]["temp_value"]
# [:comments] may or may not exist here
Run Code Online (Sandbox Code Playgroud)
在上述情况下,session[:comments]try[@comment.id]不起作用.什么会?
考虑存储在哈希中的"人".两个例子是:
fred = {:person => {:name => "Fred", :spouse => "Wilma", :children => {:child => {:name => "Pebbles"}}}}
slate = {:person => {:name => "Mr. Slate", :spouse => "Mrs. Slate"}}
Run Code Online (Sandbox Code Playgroud)
如果"人"没有任何子女,则"儿童"元素不存在.所以,对于Slate先生,我们可以检查他是否有父母:
slate_has_children = !slate[:person][:children].nil?
Run Code Online (Sandbox Code Playgroud)
那么,如果我们不知道"slate"是一个"人"哈希呢?考虑:
dino = {:pet => {:name => "Dino"}}
Run Code Online (Sandbox Code Playgroud)
我们不能再轻易检查孩子了:
dino_has_children = !dino[:person][:children].nil?
NoMethodError: undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
那么,你如何检查哈希的结构,特别是如果它被深深嵌套(甚至比这里提供的例子更深)?也许更好的问题是:这样做的"红宝石方式"是什么?
我正在使用ruby编写的一个小实用程序,它广泛使用嵌套哈希.目前,我正在检查对嵌套哈希元素的访问,如下所示:
structure = { :a => { :b => 'foo' }}
# I want structure[:a][:b]
value = nil
if structure.has_key?(:a) && structure[:a].has_key?(:b) then
value = structure[:a][:b]
end
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?我想能够说:
value = structure[:a][:b]
Run Code Online (Sandbox Code Playgroud)
而得到nil,如果:一个是不是一个关键structure,等等.
我正在寻找一种避免nil在深层嵌套哈希中检查每个级别的好方法.例如:
name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name]
Run Code Online (Sandbox Code Playgroud)
这需要三次检查,并且会产生非常难看的代码.有办法解决这个问题吗?
当尝试访问数组数组深处的元素时,如果元素不存在,避免出现错误“undefined method `[]” for nil:NilClass”的最佳方法是什么?
例如,我目前正在这样做,但对我来说似乎很糟糕:
if @foursquare['response']['groups'][0].present? && @foursquare['response']['groups'][0]['items'].present?
Run Code Online (Sandbox Code Playgroud)