如何检查一个变量是否在Ruby中定义?是否有isset类型的方法可用?
当前回答
正如许多其他示例所示,在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
其他回答
试着用“除非”而不是“如果”
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语句的计算。
这里有一些代码,没有火箭科学,但它工作得足够好
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
显然,着色代码是不必要的,在这个玩具示例中只是一个漂亮的可视化。
定义?(your_var)将工作。取决于你在做什么你也可以做your_var。nil?
应该提到的是,使用defined来检查一个特定的字段是否在哈希中设置,可能会产生意想不到的行为:
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
这里的语法是正确的,但定义?Var ['unknown']将被求值为字符串"method",因此if块将被执行
检查哈希中是否存在键的正确符号是:
if var.key?('unknown')
推荐文章
- 是否可以在MiniTest中运行单个测试?
- 如何在Ruby中生成a和b之间的随机数?
- 无法安装gem -未能建立gem本地扩展-无法加载这样的文件——mkmf (LoadError)
- 如何在Ruby中创建文件
- 什么是Ruby文件。开放模式和选项?
- Ruby数组到字符串的转换
- 如何分割(块)一个Ruby数组成X元素的部分?
- Ruby中“or”和||的区别?
- 如何测试参数是否存在在轨道
- 在Ruby中不创建新字符串而修饰字符串的规范方法是什么?
- RVM不是一个函数,用' RVM use…’不会起作用
- 了解Gemfile。锁文件
- 如何确定一个数组是否包含另一个数组的所有元素
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 最好的打印散列的方法