除非定义?我的代码没有工作

时间:2015-11-05 05:03:30

标签: ruby local-variables

我期待以下代码段:

var2 = "Not Empty" unless defined? var2

返回" Not Empty",但我没有。对此为何发生的任何见解?

2 个答案:

答案 0 :(得分:2)

defined?方法将返回:

nil =>表达无法辨认

上述代码段中的问题是局部变量的范围。 Its end on the line where you using it。要了解有关本地变量的更多信息,请查看:local_variable

pry(main)> p "local_var is not initialized" unless defined? local_var
=> "loca_var is not initialized"

但如果你这样做:

pry(main)> local_var = "initialized" unless defined? local_var
=> nil

local_var仍为nil,因为它的作用域在该行之后结束,因此分配的任何内容都被浪费了。

解决方案:我会建议您是否需要此行为,然后使用此行为:

local_var ||= "initialized"

答案 1 :(得分:0)

如果您尝试确定变量是否为var2 = "Not Empty" if var2.nil?,请尝试nildefined?更少用于不同目的(见下文)。

irb(main):009:0> var2 = nil
=> nil
irb(main):010:0> var2 = "Not Empty" if var2.nil?
=> "Not Empty"
irb(main):011:0> var2
=> "Not Empty"
irb(main):012:0> var2 = 'foo'
=> "foo"
irb(main):013:0> var2 = "Not Empty" if var2.nil?
=> nil
irb(main):014:0> var2
=> "foo"

如果您不确定变量是否已声明,则可以使用以下语法:

if defined?(var2).nil?
  var2 = "Not Empty"
end

(正如@Jordan所指出的那样,由于某种奇怪的原因,并没有全部在一条线上工作,但是这很有效。)

然而,一般来说,习惯性的Ruby方式称为" nil guard"看起来如下:

var2 ||= "Not Empty"