如何检查一个变量是否在Ruby中定义?是否有isset类型的方法可用?
当前回答
留下一个非常简单的例子,以防有用。
当变量不存在时:
if defined? a then "hi" end
# => nil
当变量存在时:
a = 2
if defined? a then "hi" end
# => "hi"
其他回答
试着用“除非”而不是“如果”
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
上述语句的正确语法是:
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)。该语法将返回一个true/false值,用于if语句的计算。
请注意“定义的”和“指定的”之间的区别。
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
X是定义的,即使它从未被赋值!
警告:常见的Ruby模式
定义的?方法就是答案。见上面接受的答案。
但是要小心……看看下面这个常见的红宝石图案:
def method1
@x ||= method2
end
def method2
nil
end
Method2总是返回nil。 第一次调用method1时,@x变量没有设置——因此method2将运行。而且 Method2将@x设为nil。
但是第二次调用method1时会发生什么呢?
记住@x已经被设置为nil。但是method2仍然会再次运行!!如果method2是一个昂贵的事业,这可能不是你想要的东西。
让定义?救援方法:
def method1
return @x if defined? @x
@x = method2
end
与大多数事情一样,关键在于实现细节。
使用定义的?YourVariable 保持简单,傻瓜..;)
推荐文章
- 是否可以在MiniTest中运行单个测试?
- 如何在Ruby中生成a和b之间的随机数?
- 无法安装gem -未能建立gem本地扩展-无法加载这样的文件——mkmf (LoadError)
- 如何在Ruby中创建文件
- 什么是Ruby文件。开放模式和选项?
- Ruby数组到字符串的转换
- 如何分割(块)一个Ruby数组成X元素的部分?
- Ruby中“or”和||的区别?
- 如何测试参数是否存在在轨道
- 在Ruby中不创建新字符串而修饰字符串的规范方法是什么?
- RVM不是一个函数,用' RVM use…’不会起作用
- 了解Gemfile。锁文件
- 如何确定一个数组是否包含另一个数组的所有元素
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 最好的打印散列的方法