假设我尝试访问这样的哈希:
my_hash['key1']['key2']['key3']
Run Code Online (Sandbox Code Playgroud)
如果key1中存在key1,key2和key3,这很好,但是如果,例如key1不存在呢?
然后我会得到NoMethodError: undefined method [] for nil:NilClass.没有人喜欢这样.
到目前为止,我处理这个有条件的事情:
if my_hash['key1'] && my_hash['key1']['key2'] ...
这是否合适,还有其他Rubiest方式吗?
我有兴趣获取params哈希的嵌套'name'参数.打电话给像
params[:subject][:name]
Run Code Online (Sandbox Code Playgroud)
当params [:subject]为空时抛出错误.为了避免这个错误,我通常写这样的东西:
if params[:subject] && params[:subject][:name]
Run Code Online (Sandbox Code Playgroud)
有没有更清洁的方法来实现这一点?
我正在寻找一种避免nil在深层嵌套哈希中检查每个级别的好方法.例如:
name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name]
Run Code Online (Sandbox Code Playgroud)
这需要三次检查,并且会产生非常难看的代码.有办法解决这个问题吗?
我相信我以前见过这个优雅的解决方案,但我找不到它:
我有一个rails控制器,可能或者可能没有以下hash元素:
myhash[:parent_field]
Run Code Online (Sandbox Code Playgroud)
在该父字段内,子元素也可以为空.我目前通过(非常丑陋的)方法检查:
if (!myhash[:parent_field] || !myhash[:parent_field][:child_field] || myhash[:parent_field][:child_field].blank?)
Run Code Online (Sandbox Code Playgroud)
哪个有效,但我认为 - 当然 - 必须有一个更优雅的方式.只是重申:
我有一个像这样的YAML文件:
options:
some_option: 'foo'
Run Code Online (Sandbox Code Playgroud)
我加载为哈希yaml,我希望能够使用它include?来获取一个布尔值,告诉它是否存在密钥.
要获取子键options,我通常会使用yaml["options"]["some_option"],但是如何判断YAML哈希是否包含["options"]["some_option"]?你做不了类似的事情:
if yaml.include? "options"["some_option"] # or
if yaml.include? ["options"]["some_option"] # or even
if yaml.include? yaml["options"]["some_option"]
Run Code Online (Sandbox Code Playgroud)
有没有办法检索optionsYAML哈希中的子键?