假设我尝试访问这样的哈希:
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方式吗?
我在Ruby中有一个字符串,我正在调用strip方法来删除前导和尾随空格.例如
s = "12345 "
s.strip
Run Code Online (Sandbox Code Playgroud)
但是,如果字符串为空,我会收到以下错误.
NoMethodError:nil的未定义方法`strip':NilClass
我正在使用Ruby 1.9,那么在调用strip方法之前,最简单的方法是检查值是否为nil?
更新:
我在数组中的元素上尝试了这个但是遇到了同样的问题:
data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip
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中是否存在参数,但它不起作用():
if ( params.has_key?([:start_date]) && params.has_key?([:end_date]) )
Run Code Online (Sandbox Code Playgroud)
我想,那是因为复杂的参数,如果我写这个:
if ( params.has_key?([:report][:start_date]) && params.has_key?([:report][:end_date]) )
Run Code Online (Sandbox Code Playgroud)
给我错误
can't convert Symbol into Integer
Run Code Online (Sandbox Code Playgroud)
这也行不通:
if ( params[:report][:start_date] && params[:report][:end_date] )
Run Code Online (Sandbox Code Playgroud)
给我错误:
undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
它总是进入其他声明.
这是我的参数:
report:
start_date: 01/08/2012
end_date: 10/08/2012
Run Code Online (Sandbox Code Playgroud)
有人能帮我吗 ?
我正在使用的rails应用程序中有以下非常难看的ruby代码:
if params.present?
if params[:search].present?
if params[:search][:tags_name_in].present?
...
end
end
end
Run Code Online (Sandbox Code Playgroud)
所有我想问的是是否已经定义了params [:search] [:tags_name_in],但因为params,params [:search]和params [:search] [:tags_name_in]可能都是零,如果我使用...
if params[:search][:tags_name_in].present?
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)
哪个有效,但我认为 - 当然 - 必须有一个更优雅的方式.只是重申:
什么是最简洁的方法来确定是否@hash[:key1][:key2]
已定义,如果@hash
或@hash[:key1]
为零,则不会抛出错误?
defined?(@hash[:key1][:key2])
如果@hash[:key1]
存在则返回True (它不确定是否:key2
已定义)
我正在写一个简单的脚本,从debian网站获取一些软件包的细节.在处理没有与之关联的版本的虚拟包时遇到问题.
我收到以下错误消息
undefined method `first' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
罪魁祸首是
version = doc.css('#content h1').text.strip.scan( /\(([^>]*)\)/).last.first
Run Code Online (Sandbox Code Playgroud)
我试着将它放入if这样的条件,但这不起作用.
if doc.css('#content h1').text
version = doc.css('#content h1').text.strip.scan( /\(([^>]*)\)/).last.first
end
Run Code Online (Sandbox Code Playgroud)
所以我想知道如何检查对象是否为nil,然后尝试从中提取子字符串.
这是包含except块的整个脚本
require 'rubygems'
require 'nokogiri'
require 'open-uri'
# additional code to make sure that we can resume after a break seamlessly
last_package = 0
File.open('lastbreak','r') { |fptr| last_package = fptr.gets.to_i }
puts "Resuming from package:#{last_package}" if last_package != 0
# to read each package from packageslist.txt and fetch the required info
# also to store …
Run Code Online (Sandbox Code Playgroud) ruby ×7
hash ×4
null ×4
conditional ×1
defined ×1
if-statement ×1
methods ×1
params ×1
undefined ×1