blah = 10
def what?
"#{blah}"
end
puts what?
# =>
# NameError: undefined local variable or method `blah' for main:Object
# from (irb):3:in `what?'
# from (irb):5
# from E:/RailsInstaller/Ruby1.9.3/bin/irb:12:in `<main>`
为什么呢?写这个的正确方法是什么?我应该只在局部范围内复制变量还是有更好的变体?
答案 0 :(得分:4)
您需要在此处定义的实例变量或方法:
@blah = 10
def what?
"#{@blah}"
end
或者像这样:
def blah
10
end
def what?
"#{blah}"
end
答案 1 :(得分:2)
当Ruby看到def
关键字时,它会更改范围。 blah
变量在方法之外具有局部范围,因此如果您想要使用该值,则需要将其传入。
您可以将blah
变量更改为实例变量,并且它将在编写方法的范围内。
传递局部变量可能比更改变量的范围更好。
方法名称有一个问号,通常表示“布尔”值。虽然没有严格规定,但这将是true
或false
的返回,但是当它返回nil
或 truthy 返回时,您会看到它被使用。 / p>
您的代码可能最好这样编写:
def what(blah)
blah
end
希望有所帮助。
编辑:要解决父变量,我们需要引入父关系。
# encoding: utf-8
class ParentBlah
def initialize
@blah = "Blah"
end
end
class ChildBlah < ParentBlah
def use_parent_variable_sorta
"@blah = #{@blah}"
end
end
childblah = ChildBlah.new
puts childblah.use_parent_variable_sorta
现在我们可以讨论为什么无法使用局部变量,这完全是范围问题。为了完成我们在这里所做的事情,我们需要在同一范围内创建变量。
为什么这样做?因为对象外部的逻辑不需要被对象固有地知道。当确实需要知道时,只会通过参数引入值,或者需要更改范围。我们倾向于认为,如果为此目的需要改变范围,可能会有其他事情发生。
答案 2 :(得分:2)
blah是你的本地变量; 您可以做什么做一个实例变量或创建一个全局变量,你在变量之前使用“$”符号,如下所述
首先,您可以检查变量的范围,如下所示
blah = 10
defined? blah
结果=&gt; “局部变量”强>
将blah作为全局变量,你可以做到
$blah = 10
defined? $blah
结果=&gt; “全局变量”强>
def what?
puts "#{$blah}"
end
然后调用方法
puts what?
结果为10