变量如何具有值并且也未定义?

时间:2014-02-05 10:15:19

标签: ruby variables

我正在尝试学习红宝石,并且遇到了一些奇怪的事情。这段代码:

if defined? branch
    puts "param: #{branch}\n"
else
    puts "no branch! #{branch}\n"
end

输出“no branch!thisisateststring \ n”,其中'thisisateststring'是在程序中早先分配给变量分支的值。如何变量branch可以赋值给它,但不能定义?

编辑:

人们似乎不理解我的问题。在这个具体的例子中,我并没有要求你弄清楚为什么else正在执行;我一般都在问这怎么可能发生。换句话说,在此之前需要插入什么代码才能导致我的情况发生?

正如我所说的,我是红宝石的新手,所以我很容易误解一些基本的东西。我不是想解决一个具体的问题;我试图通过了解更多关于红宝石的工作原理来提高我的理解力。在这个例子中,ruby如何输出一个字符串,同时仍然认为它没有被定义。

4 个答案:

答案 0 :(得分:2)

@hirolau给了你一个有效的例子。我想重用他的想法并为你简化一下。请尝试以下方法:

defined? foo
=> nil

foo
NameError: undefined local variable or method 'foo' for main:Object

def method_missing(m, *params, &block)
   if m.to_s == "foo"
    return "cool stuff"
   end  
end 

# foo is still not defined
defined? foo
=> nil

# but returns some value
foo
=> "cool stuff"

答案 1 :(得分:1)

通常不行,但Ruby有很多方法可以处理丢失的方法和未定义的变量。考虑例如:

class Tree
  def  initialize
    if defined? branch
      p "param: #{branch}\n"
      else
      p "no branch! #{branch}\n"
    end
  end

  def method_missing(method_call)
    return 'this text comes from method_missing'
  end

end

a = Tree.new #=> "no branch! this text comes from method_missing"

class Tree
  def branch
    return 'NOW I HAVE MY OWN METHOD'
  end
end

a = Tree.new #=> "param: NOW I HAVE MY OWN METHOD"

如果没有声明的背景,很难提供有关您的问题的更多信息。

答案 2 :(得分:0)

defined? Ruby关键字不检查目标是否为nil,而是检查目标是否指向任何可识别的内容(文本对象,已初始化的局部变量,当前可见的方法名称)范围等)。“

查看文档以了解其行为。 http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-defined-3F

如果要检查变量是否为零,可以执行以下操作:

if branch.nil? or branch.empty?
    puts "no branch!\n"
else
    puts "param: #{branch}\n"
end

答案 3 :(得分:0)

Ruby中的

defined?是一个关键字。

它返回nil或对象作为字符串的描述。

在Ruby中,评估为false的唯一两件事是falsenil

因此,如果您要查找的“事物”未定义,那么defined?将返回nil,这将在您的代码中评估为false,如您的问题所示。< / p>

回答你的问题:“变量怎样才有值,也没有定义?”

它不能。如果它没有被定义为变量,它甚至可能是一个变量。但它可以定义为变量,其值为nil