检查是否定义了变量?

时间:2008-11-13 23:14:06

标签: ruby reflection

如何检查Ruby中是否定义了变量?是否有isset类型的方法?

15 个答案:

答案 0 :(得分:771)

使用defined?关键字(documentation)。它将返回一个包含项目类型的String,如果它不存在则返回nil

>> a = 1
 => 1
>> defined? a
 => "local-variable"
>> defined? b
 => nil
>> defined? nil
 => "nil"
>> defined? String
 => "constant"
>> defined? 1
 => "expression"

正如skalee评论的那样:“值得注意的是,设置为nil的变量已初始化。”

>> n = nil  
>> defined? n
 => "local-variable"

答案 1 :(得分:91)

如果您确实存在则不执行任何操作,但如果它不存在则创建它,这将非常有用。

def get_var
  @var ||= SomeClass.new()
end

这只会创建一次新实例。之后它只是不断返回var。

答案 2 :(得分:70)

上述陈述的正确语法是:

if (defined?(var)).nil? # will now return true or false
 print "var is not defined\n".color(:red)
else
 print "var is defined\n".color(:green)
end

用您的变量替换(var)。此语法将在if语句中返回true / false值以进行评估。

答案 3 :(得分:18)

defined?(your_var)会奏效。根据您正在做的事情,您还可以执行your_var.nil?

之类的操作

答案 4 :(得分:15)

尝试“除非”而不是“如果”

a = "apple"
# Note that b is not declared
c = nil

unless defined? a
    puts "a is not defined"
end

unless defined? b
    puts "b is not defined"
end

unless defined? c
    puts "c is not defined"
end

答案 5 :(得分:9)

使用defined? YourVariable
保持简单愚蠢 ..;)

答案 6 :(得分:7)

这是一些代码,没有什么火箭科学,但它运作良好

require 'rubygems'
require 'rainbow'
if defined?(var).nil?  # .nil? is optional but might make for clearer intent.
 print "var is not defined\n".color(:red)
else
 print "car is defined\n".color(:green)
end

显然,着色代码不是必需的,只是这个玩具示例中的一个很好的视觉效果。

答案 7 :(得分:6)

警告Re:常见的Ruby模式

这是关键答案:defined?方法。上面接受的答案完美地说明了这一点

但是有一条鲨鱼潜伏在海浪之下......

考虑这种常见的红宝石模式:

 def method1
    @x ||= method2
 end

 def method2
    nil
 end

method2始终返回nil。第一次拨打method1时,@x变量未设置 - 因此将运行method2。 并method2@x设置为nil。那很好,一切都很好。但是第二次拨打method1会发生什么?

记住@x已经设置为nil。 But method2仍将继续运行!!如果method2是一项代价高昂的工作,那么这可能不是您想要的。

defined?方法拯救 - 使用此解决方案,处理特定情况 - 使用以下内容:

  def method1
    return @x if defined? @x
    @x = method2
  end

魔鬼在细节中:但你可以用defined?方法躲避潜伏的鲨鱼。

答案 8 :(得分:5)

您可以尝试:

unless defined?(var)
  #ruby code goes here
end
=> true

因为它返回一个布尔值。

答案 9 :(得分:3)

正如许多其他示例所示,您实际上不需要方法中的布尔值来在ruby中进行逻辑选择。除非你真的需要布尔值,否则将所有内容强制转换为布尔值将是一种糟糕的形式。

但是如果你绝对需要一个布尔值。使用 !! (bang bang)或" falsy falsy揭示真相"。

› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false

为什么它通常不会付出代价:

>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true

这是一个重要的例子,因为它依赖于布尔值对其字符串表示的隐式强制。

>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil

答案 10 :(得分:3)

应该提到的是,使用set.seed(123) x <- rnorm(100) y <- density(x, n = 2^12) ggplot(data.frame(x = y$x, y = y$y), aes(x, y)) + geom_line() + geom_segment(aes(xend = x, yend = 0, colour = x)) + scale_color_gradient(low = 'green', high = 'red') 检查哈希中是否设置了特定字段可能会出现意外情况:

defined

这里的语法是正确的,但var = {} if defined? var['unknown'] puts 'this is unexpected' end # will output "this is unexpected" 将被计算为字符串defined? var['unknown'],因此"method"块将被执行

编辑:检查哈希中是否存在密钥的正确表示法是:

if

答案 11 :(得分:2)

请注意&#34;定义&#34;之间的区别和&#34;分配&#34;。

$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
即使从未分配过,也会定义

x!

答案 12 :(得分:0)

此外,如果你编码,你可以通过插值检查它是否在字符串中定义:

puts "Is array1 defined and what type is it? #{defined?(@array1)}"

系统会告诉您类型是否已定义。 如果没有定义,它只会返回一个警告,说明该变量未初始化。

希望这有帮助! :)

答案 13 :(得分:0)

wwwroot很棒,但是如果你在Rails环境中,你也可以使用defined?,特别是在你想要检查动态变量名的情况下:

try

答案 14 :(得分:0)

留下一个非常简单的例子,以防万一。

当变量不存在时:

if defined? a then "hi" end
# => nil

当变量确实存在时:

a = 2
if defined? a then "hi" end
# => "hi"