测试变量是否为nil或false的最佳方法

时间:2014-07-03 18:42:20

标签: ruby

我希望有人可以帮我识别最常用的方法来测试变量是否为nil或false,以便于阅读。

这是我明确的例子:

if somevar.nil? # explicitly checking for nil.
  puts "Its nil."
end

写作是否更好:

if !somevar # implicit
  puts "Var is nil or false."
end

我真的很喜欢这样:

if not somevar # implicit
  puts "Var is nil or false"
end 

从我正在阅读的内容来看,应该在某种程度上避免明确地测试nil,因为它通常不需要。大多数示例建议仅在存在变量时才采取措施。但是,我想在变量不存在时执行操作。

弃绝的主要灵感来自:ruby_idioms

3 个答案:

答案 0 :(得分:3)

def truthiness(value)
  if value
    "truthy"
  else
    "falsy"
  end
end

puts "nil:",   truthiness(nil)    # falsy
puts "false:", truthiness(false)  # falsy
puts "true:",  truthiness(true)   # truthy
puts "[]:",    truthiness([])     # truthy
puts "{}:",    truthiness({})     # truthy
puts "0:",     truthiness(0)      # truthy

我知道你了解Python,所以我可以这样说:

在Python中,None,False和空容器(如[],{},甚至0)都是假的。

在Ruby中,nil和false都是假的,而大多数其他的东西都是真的,甚至是[],{}和0。

答案 1 :(得分:3)

我认为ruby中用于测试某些内容falsenil的最惯用方法是使用unless

unless somevar
  puts "Var is nil or false."
end

来自ruby style guide

  

对于负面条件(或控制流程),请unless超过if   ||)。

# bad
do_something if !some_condition

# bad
do_something if not some_condition

# good
do_something unless some_condition

# another good option
some_condition || do_something

答案 2 :(得分:2)

您可以使用defined?关键字:

  

defined?表达式测试表达式是否引用任何可识别的内容(文本对象,已初始化的局部变量,当前作用域中可见的方法名称等)。 如果无法解析表达式,则返回值为nil 。否则,返回值提供有关表达式的信息。

unless defined?(var)
   #your code
end

快速PRY测试,defined?在定义变量时返回的内容以及何时不返回: -

arup@linux-wzza:~/Ruby> pry
[1] pry(main)> defined?(x)
=> nil
[2] pry(main)> x = nil
=> nil
[3] pry(main)> defined? x
=> "local-variable"
[4] pry(main)>