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为什么选择这种语言设计方式?(对不起,我忘了添加通知)非常感谢,请看下面我的评论。请看下面我的评论。