我正在尝试学习红宝石,并且遇到了一些奇怪的事情。这段代码:
if defined? branch
puts "param: #{branch}\n"
else
puts "no branch! #{branch}\n"
end
输出“no branch!thisisateststring \ n”,其中'thisisateststring'是在程序中早先分配给变量分支的值。如何变量branch
可以赋值给它,但不能定义?
编辑:
人们似乎不理解我的问题。在这个具体的例子中,我并没有要求你弄清楚为什么else
正在执行;我一般都在问这怎么可能发生。换句话说,在此之前需要插入什么代码才能导致我的情况发生?
正如我所说的,我是红宝石的新手,所以我很容易误解一些基本的东西。我不是想解决一个具体的问题;我试图通过了解更多关于红宝石的工作原理来提高我的理解力。在这个例子中,ruby如何输出一个字符串,同时仍然认为它没有被定义。
答案 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)
defined?
是一个关键字。
它返回nil
或对象作为字符串的描述。
在Ruby中,评估为false的唯一两件事是false
和nil
因此,如果您要查找的“事物”未定义,那么defined?
将返回nil
,这将在您的代码中评估为false,如您的问题所示。< / p>
回答你的问题:“变量怎样才有值,也没有定义?”
它不能。如果它没有被定义为变量,它甚至可能是一个变量。但它可以定义为变量,其值为nil
。