我最近开始学习ruby,我对实例变量和局部变量以及类变量感到困惑。所以,我最近编写的代码将找到1000个素数中最大的回文数。 代码是:
def prime_large(number)
arr_prime = []
Prime.each(number) do |x|
new_arr_prime = arr_prime.push(x.to_s)
updated = new_arr_prime.select { |y| y.reverse == y }
end
p updated.max
end
p prime_large(1000)
我得到的错误是:
undefined local variable or method `updated' for main:Object (NameError)
我知道更新是素数的局部变量,所以我不能在它之外访问它,但我通过将其替换为@updated来改变代码,如下所示:
def prime_large(number)
arr_prime = []
Prime.each(number) do |x|
new_arr_prime = arr_prime.push(x.to_s)
@updated = new_arr_prime.select { |y| y.reverse == y }
end
p @updated.max
end
p prime_large(1000)
更改后,我得到了输出:
"929"
"929"
在我的代码中,没有创建一个类,我的实例变量(@updated)是如何工作的。我在本地变量和实例变量之间感到困惑。任何人都可以解释我的差异以及它们的工作方式吗?
答案 0 :(得分:5)
在您的第一个示例中,您创建了一个本地变量updated
,该变量只能在其定义的块范围内访问。含义,它仅在{{1阻止。
在第二个示例中,您创建了实例变量 Prime.each(number) do end
。
没有创建一个类我的实例变量(@updated)是怎样的 工作
因为在Ruby中,一切都发生在某个对象的上下文中。即使您没有创建一个类,您也处于对象@updated
的上下文中的顶级上下文中。
因此,顶级中定义的任何实例变量都是此对象的实例变量main
。
回到你的问题,要克服它,你只想在main
块之外定义updated
局部变量:
Prime.each(number) do end
要测试它,您可以打开irb或pry并自行检查:
def prime_large(number)
arr_prime = []
updated = nil # initialize local varialbe
Prime.each(number) do |x|
new_arr_prime = arr_prime.push(x.to_s)
updated = new_arr_prime.select { |y| y.reverse == y } # assign new value
end
p updated.max
end
p prime_large(1000)
您现在想要了解的是Ruby中的词法范围。