如何检查Ruby中是否定义了变量?是否有isset
类型的方法?
答案 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)
这是关键答案: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"