界定?在Ruby中工作在irb但不在我的类文件中

Mik*_*ike 1 ruby

我正在编写一个小的Heap实现,在创建我的Node类时,我发现了一些奇怪的行为.我想调用defined?(x)以确保x已定义,然后检查是否x为Integer,然后将其存储在Node的value类变量中.在IRB我可以打电话 defined?(x),结果是零.

但是,在课堂上,我试试这个:

def change_value value
  @value = value if defined?(value)
end
Run Code Online (Sandbox Code Playgroud)

当我change_value用随机字母调用时,让我们说'e',是标准的未定义局部变量或方法错误.再次,在IRB中,它似乎工作正常,我想知道我是否有某种环境问题,或者如果这不是检查价值是否确实存在的"最佳"方式.

谢谢.

Avd*_*vdi 7

(编辑:Dig​​italRoss已经清理了问题的格式,因此格式化和初始重写的注释可能不再适用.我会留下它们,直到我从OP获得一些反馈.)

这是一种几乎不可读的编写方法的方法,它甚至不在我的机器上解析(Ruby 1.8.7).

我假设你的意思是:

def change_value(value)
  @value = value if defined?(value)
end
Run Code Online (Sandbox Code Playgroud)

我打电话的时候这很好用,但是不对.nil和undefined是Ruby中的两个不同的野兽; value始终在该上下文中定义,因为它是声明的方法参数.我怀疑你真正追求的是:

def change_value(value)
  @value = value unless value.nil?
end
Run Code Online (Sandbox Code Playgroud)

请注意,有些人会将其写为:

def change_value(value)
  @value = value if value
end
Run Code Online (Sandbox Code Playgroud)

因为nil是"虚假的".然而,这种形式合并了nilfalse,所以它不是一个好习惯进入.