Ruby 检查是否定义了变量?
如何检查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
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