在实例变量和局部变量之间混淆

rob*_*ams 4 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-4

我最近开始学习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)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

undefined local variable or method `updated' for main:Object (NameError)
Run Code Online (Sandbox Code Playgroud)

我知道更新是素数的局部变量所以我不能在它之外访问它但我通过用@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)
Run Code Online (Sandbox Code Playgroud)

更改后,我得到了输出:

"929"
"929"
Run Code Online (Sandbox Code Playgroud)

在我的代码中,没有创建一个类,我的实例变量(@updated)是如何工作的.我在本地变量和实例变量之间感到困惑.任何人都可以解释我的差异和他们的工作方式吗?

And*_*eko 5

在第一个示例中,您创建了一个局部变量updated,该变量只能在其定义的块的范围内访问.含义,它仅在Prime.each(number) do end块内可用.

在第二个示例中,您创建了实例变量 @updated.

没有创建一个类,我的实例变量(@updated)是如何工作的

这是因为在Ruby中,一切都发生在某个对象的上下文中.即使您没有创建一个类,您也可以在对象的上下文中处于顶级上下文中main.

因此,顶层中定义的任何实例变量都是此对象的实例变量main.

所以回到你的问题,克服它你只想updatedPrime.each(number) do end块外定义局部变量:

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)
Run Code Online (Sandbox Code Playgroud)

要测试它,你可以打开irb或pry并自己检查:

self               # the object in the context of which you are currently
#=> main
self.class         # main is an instance of class Object, any methods defined
                   # within main are added to Object class as instance methods
#=> Object
instance_variables # list of it's instance variables, none yet created
#=> []
@variable = 1      # create and instance variable
#=> 1
instance_variables # now created variable occurs in the list of current object's instance variables
#=> [:@variable]
def hello; :hello end # define method
#=> :hello
self.class.public_instance_methods(false) # list instance methods defined in Object
#=> [:hello]
Run Code Online (Sandbox Code Playgroud)

你现在想要了解的是Ruby中的词法范围.