微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 在实例变量和局部变量之间混淆

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

解决方法

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

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

without creating a class how my instance variable ( @updated) is
working

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

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

所以回到你的问题,为了克服它,你只想在Prime.each(数字)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)

要测试它,你可以打开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中的词法范围.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐