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

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

4

3 回答 3

4

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

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

或像这样:

def blah
  10
end

def what?
  "#{blah}"
end
于 2012-11-22T19:02:39.027 回答
2

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

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

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

方法名称有一个问号,通常表示“布尔”值。尽管没有严格规定,但这将是trueor的返回false,尽管您会看到它在返回nil真实返回时使用它。

你的代码最好这样写:

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

现在我们可以谈谈为什么不能使用局部变量了,这完全是一个范围问题。为了做我们在这里所做的事情,我们需要在相同的范围内创建变量。

为什么这样做?因为对象之外的逻辑不需要对象本身就知道。当确实需要知道它时,只需通过参数引入值,或者需要更改范围。我们倾向于认为,如果需要为此目的更改范围,则可能会发生其他事情。

于 2012-11-22T19:06:09.997 回答
2

blah 是你的局部变量;您可以做什么来制作实例变量或制作全局变量,您可以在变量前使用“$”符号,如下所述

首先,您可以检查变量的范围,如下所示

blah = 10
defined? blah

结果=>“局部变量”

要将 blah 作为全局变量,您可以这样做

$blah = 10
defined? $blah

结果=>“全局变量”

def what?
  puts "#{$blah}"
end

然后调用方法

puts what?

结果将是 10

于 2012-11-23T04:01:05.840 回答