在实例变量和局部变量

时间:2016-10-05 18:41:07

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

我最近开始学习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)是如何工作的。我在本地变量和实例变量之间感到困惑。任何人都可以解释我的差异以及它们的工作方式吗?

1 个答案:

答案 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中的词法范围。