Can';t调用在父作用域中分配的局部变量 blah=10 def什么? “#{blah}” 结束 放什么? # => #NameError:未定义的局部变量或main:Object的方法“blah” #来自(irb):3:在‘什么?’ #来自(irb):5 #从E:/RailsInstaller/Ruby1.9.3/bin/irb:12:in``

Can';t调用在父作用域中分配的局部变量 blah=10 def什么? “#{blah}” 结束 放什么? # => #NameError:未定义的局部变量或main:Object的方法“blah” #来自(irb):3:在‘什么?’ #来自(irb):5 #从E:/RailsInstaller/Ruby1.9.3/bin/irb:12:in``,ruby,scope,local-variables,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:/

为什么??写这篇文章的正确方法是什么?我应该在局部范围内复制一个变量,还是有更好的变量?

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

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>`
或者像这样:

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

def what?
  "#{blah}"
end

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

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

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

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

您的代码最好是这样编写的:

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

def what?
  "#{blah}"
end
希望有帮助

编辑:为了处理父变量,我们需要引入父关系

def what(blah)
  blah
end
编码:utf-8 班级家长等等 def初始化 @blah=“blah” 结束 结束 类ChildBlah 现在我们可以讨论为什么不能使用局部变量,这完全是一个范围问题。为了完成我们在这里所做的工作,我们需要在相同的范围内创建变量


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

blah是您的局部变量; 您可以做什么来生成一个实例变量,或者要生成一个全局变量,请在变量之前使用“$”符号,如下所述

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

# 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
结果=>“局部变量”

要使blah成为全局变量,可以执行以下操作

blah = 10
defined? blah
结果=>“全局变量”

然后调用该方法

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

结果是10

谢谢你的回答,我知道Ruby中的代码约定,我知道这个问题的解决方案(这是一个学术性的例子)。主要问题是:为什么Ruby不允许在字符串插值中使用父范围变量,而允许在父范围中使用方法?Ruby为什么选择这种语言设计方式?(对不起,我忘了添加通知)非常感谢,请看下面我的评论。请看下面我的评论。