范围,Ruby和Python(Scope in Ruby and Python)

2019-08-17 03:47发布

我一直在学习Ruby和Python同时和我注意到的事情之一是,这2种语言似乎区别对待范围。 下面是我的意思的例子:

# Python
a = 5
def myfunc():
  print a

myfunc() # => Successfully prints 5

# Ruby
a = 5
def myfunc
  puts a
end

myfunc # => Throws a "NameError: undefined local variable or method `a' for main:Object"

看来,DEF块可以访问在Python它的直接范围之外,但不是在Ruby中声明的变量。 有人可以证实我的理解是否正确? 如果是的话,的范围思考下列方式之一是在编程中比较常见?

Answer 1:

免责声明:我不是蟒蛇专家

在Python,其中变量的模块中定义的是,默认情况下,模块的变量并作为这样的全局到该模块。 在Ruby中,当你定义一个变量小写,它始终是一个局部变量。 局部变量只在定义它们的块,并在该块住变量定义特效/ lambda表达式访问。

在Ruby中,用于可变交叉范围,它需要是以下之一:

  • 常数( ALL_CAPS ):始终接近,如果前面加上合适的范围
  • 类变量( @@double_at ):从定义类和子类的任何总是可访问,但不能从外部
  • 实例变量( @single_at ):只从该对象内无障碍,以及从与吸气剂的方法/外get_instance_variable
  • 全球( $starts_with_dollar ):一个坏主意。 跨越所有范围,没有范围需要。 不使用!


Answer 2:

在Ruby中,如果你想访问你调用你需要将其定义为全球性的方法之外定义的变量。 红宝石尝试在本地范围内定义的变量匹配,如果没有找到它,抛出异常。

您可以定义一个全局变量$符号。

$a = 5
def myfunc
  puts $a
end

myfunc

但是作为一个一般的规则是不是一个好的做法,以定义全局变量,否则将冒污染全局命名空间。



Answer 3:

您可以使用dis模块,看看Python是做什么。

import dis

a = 5
def myfunc():
  print a

结果:

>>> dis.dis(myfunc)
 15           0 LOAD_GLOBAL              0 (a)
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE

所以,你可以看到, a是在全球范围内。



文章来源: Scope in Ruby and Python