我最近开始学习
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中的词法范围.