【问题标题】:confused between instance variable and local variable混淆实例变量和局部变量
【发布时间】:2016-10-05 18:41:06
【问题描述】:

我最近开始学习 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 是素数的局部变量,因此我无法在它之外访问它,但我通过将其替换为 @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) 如何工作的类。我对局部变量和实例变量感到困惑。谁能解释一下它们的区别以及它们是如何工作的?

【问题讨论】:

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


    【解决方案1】:

    在您的第一个示例中,您创建了一个 local 变量 updated,它只能在定义它的块的范围内访问。意思是,它只能在 Prime.each(number) do end 块内使用。

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

    在不创建类的情况下,我的实例变量 (@updated) 是怎样的 工作

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

    因此,在顶层定义的任何实例变量都是该对象main的实例变量。

    回到你的问题,为了克服它,你只需要在 Prime.each(number) do end 块之外定义 updated 局部变量:

    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)
    

    要测试它,你可以打开 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]
    

    您现在想了解的是 Ruby 中的词法作用域。

    【讨论】:

    • 解释一下如何解决这个问题可能会很有用(即:在块范围之外初始化变量)。
    • @Jordan 我本来打算写它的,但我认为关于范围的整个事情使它变得直观。我会编辑答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2016-12-27
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多