Ruby 检查是否定义了变量?

Ruby 检查是否定义了变量?,ruby,reflection,Ruby,Reflection,如何检查Ruby中是否定义了变量?是否有isset-type方法可用?已定义?(您的变量)将起作用。根据您正在做的事情,您还可以执行类似于your_var.nil?使用定义的?关键字()。它将返回一个带有项目类型的字符串,如果它不存在,则返回nil >> a = 1 => 1 >> defined? a => "local-variable" >> defined? b => nil >> defined? nil =&g

如何检查Ruby中是否定义了变量?是否有
isset
-type方法可用?

已定义?(您的变量)
将起作用。根据您正在做的事情,您还可以执行类似于
your_var.nil?

使用
定义的?
关键字()。它将返回一个带有项目类型的字符串,如果它不存在,则返回
nil

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

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


如果您不想在它确实存在时执行任何操作,但想在它不存在时创建它,那么这非常有用

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

这只会创建一次新实例。之后,它会继续返回变量。

这里有一些代码,没有什么是火箭科学,但它工作得很好

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

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

上述语句的正确语法是:

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语句中返回真/假值进行计算。

您可以尝试:

unless defined?(var)
  #ruby code goes here
end
=> true
因为它返回一个布尔值。

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


是否使用定义的
?您的变量


保持简单愚蠢。)

请注意“已定义”和“已分配”之间的区别


x已定义,即使从未指定

此外,如果编码为:

puts "Is array1 defined and what type is it? #{defined?(@array1)}"
如果定义了类型,系统将告诉您该类型。 如果没有定义它,它只会返回一个警告,说明变量未初始化

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

希望这有帮助!:)

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

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

为什么强制通常不起作用:

>> (!!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
警告Re:一种常见的Ruby模式 这是关键答案:
定义?
方法。上述公认的答案完美地说明了这一点

但是有一条鲨鱼,潜伏在海浪下……

考虑这种常见的ruby模式:

 def method1
    @x ||= method2
 end

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

记住@x已经被设置为零<代码>但方法2仍将再次运行!!如果method2是一项耗资巨大的任务,那么这可能不是您想要的

定义?
方法发挥作用-使用此解决方案,处理特定情况-使用以下方法:

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

魔鬼在细节中:但是你可以用
定义的?
方法避开潜伏的鲨鱼。

应该提到的是,使用
定义的
检查散列中是否设置了特定字段可能会表现出意想不到的行为:

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

编辑:检查散列中是否存在键的正确符号为:

if var.key?('unknown')

已定义?
很好,但是如果您在Rails环境中,也可以使用
try
,尤其是在需要检查动态变量名的情况下:

foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo)        # => 1
try(:bar)        # => nil
try(my_foo)      # => 1
try(my_bar)      # => nil

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

当变量不存在时

if defined? a then "hi" end
# => nil
当变量确实存在时

if defined? a then "hi" end
# => nil
a=2
如果定义?然后是“你好”的结尾
#=>“你好”

值得注意的是,设置为
nil
的变量已经初始化。如果您想设置一个不存在的变量,如果它存在,就不要去管它,请参阅下面@danmayer的答案(包括
|124;=
运算符)。这里是我可以考虑的另一个奇怪之处。。如果在If块中定义了一个从未满足条件的变量,
defined?
对于在该块中定义的变量仍然返回true!有没有像
这样定义的方法?
返回布尔值?要返回真/假,
!!定义?(object_name)
这也是非常惯用的Ruby,顺便说一句,非常典型。只是不要将
|124;=
与布尔值一起使用,以免你感到困惑的痛苦。@AndrewMarshall说,避免使用任何可能返回
nil
的内容来使用此习惯用法,除非您确实希望在每次调用表达式时在表达式返回
nil
时对其求值。如果您使用布尔值,并且如果变量未显式设置为false,则希望默认值为true,则可以使用以下结构:
var=(var或var.nil?
@ArnaudMeuret——虽然它可能看起来不完全相同,但值得阅读该问题的答案。这不是必需的,因为在测试中使用nil时计算结果为false为什么不定义
(var)==nil
?@vol7ron-这是非常有效的语法。使用调用
.nil?
更惯用,正如他们所说的。它更“面向对象”询问一个对象是否为
nil
,比使用比较运算符要好。两者都不难理解,因此请使用有助于您运送更多产品的运算符。您指的是哪一种语句?!不要使用答案作为对其他内容的注释。这个答案添加了什么其他答案没有提到的内容?它很好地回答了问题以一种更有用的方式打开,不是吗?《ruby风格指南》说“如果条件为负面,则不支持”,大概是因为
nil?
是可选的
foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo)        # => 1
try(:bar)        # => nil
try(my_foo)      # => 1
try(my_bar)      # => nil
if defined? a then "hi" end
# => nil