如何检查一个变量是否在Ruby中定义?是否有isset类型的方法可用?
当前回答
定义?(your_var)将工作。取决于你在做什么你也可以做your_var。nil?
其他回答
警告:常见的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
与大多数事情一样,关键在于实现细节。
你可以试试:
unless defined?(var)
#ruby code goes here
end
=> true
因为它返回一个布尔值。
如果它存在,你什么也不做,如果它不存在,你就创建它,这是很有用的。
def get_var
@var ||= SomeClass.new()
end
这只创建一次新实例。之后它就一直返回var。
这里有一些代码,没有火箭科学,但它工作得足够好
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? a then "hi" end
# => nil
当变量存在时:
a = 2
if defined? a then "hi" end
# => "hi"
推荐文章
- .NET反射的成本有多高?
- Ruby中没有增量操作符(++)?
- 如何得到一个特定的输出迭代哈希在Ruby?
- Ruby正则表达式中\A \z和^ $的区别
- __FILE__在Ruby中是什么意思?
- Paperclip::Errors::MissingRequiredValidatorError with Rails
- Ruby:如何将散列转换为HTTP参数?
- 在ROR迁移期间,将列类型从Date更改为DateTime
- 反射:如何调用带参数的方法
- 把一个元素推到数组开头最简单的方法是什么?
- ActiveRecord:大小vs计数
- Ruby的dup和克隆方法有什么区别?
- 我怎么才能跳出露比·普利的怪圈?
- 使用反射调用静态方法
- Rails:在大数字中添加逗号有Rails技巧吗?