无法调用父作用域中指定的局部变量

时间:2012-11-22 19:00:05

标签: ruby scope local-variables

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>`

为什么呢?写这个的正确方法是什么?我应该只在局部范围内复制变量还是有更好的变体?

3 个答案:

答案 0 :(得分:4)

您需要在此处定义的实例变量或方法:

@blah = 10
def what?
  "#{@blah}"
end

或者像这样:

def blah
  10
end

def what?
  "#{blah}"
end

答案 1 :(得分:2)

当Ruby看到def关键字时,它会更改范围。 blah变量在方法之外具有局部范围,因此如果您想要使用该值,则需要将其传入。

您可以将blah变量更改为实例变量,并且它将在编写方法的范围内。

传递局部变量可能比更改变量的范围更好。

方法名称有一个问号,通常表示“布尔”值。虽然没有严格规定,但这将是truefalse的返回,但是当它返回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