Ruby中的全局变量

全局变量是可以从程序中的任何位置访问的变量,无论范围如何。他们'用$(美元符号)字符开头重新表示。然而,全局变量的使用通常被认为是"un-Ruby,"你很少会看到它们。

定义全局变量

全局变量的定义和使用与任何其他变量一样。要定义它们,只需为它们分配一个值并开始使用它们。但是,正如他们的名字所暗示的那样,从程序中的任何一点分配给全局变量都具有全局意义。以下程序演示了这一点。该方法将修改全局变量,这将影响方法的运行方式。

 $速度=10def加速$速度=100结束def通过Ø速度Ø陷阱如果$speed>65#给这个计划一张超速票结束结束加快通过速度陷阱

不受欢迎

那么为什么这个"联合国红宝石"为什么你经常看到全局变量?简而言之,它打破了封装。如果任何一个类或方法可以随意修改全局变量的状态而没有接口层,则依赖于该全局变量的任何其他类或方法可能以意想不到的方式表现。此外,这种交互可能非常难以调试。什么修改了这个全局变量,什么时候?您'将查看相当多的代码以找到它是做什么的,并且可以通过不违反封装规则来避免。

但那'并不是说全局变量从不生活知识科普用于Ruby。有许多特殊的全局变量具有单个字符名(a-la Perl),可以在整个程序中使用。它们代表程序本身的状态,并为所有gets方法修改记录和字段分隔符等操作。

全局变量

  • $0-此变量由$0(that's为零)表示的able保留正在执行的顶层脚本的名称。换句话说,从命令行运行的脚本文件,而不是保存当前执行代码的脚本文件。因此,如果从命令行运行script1.rb,则它将保持script1.rb。如果此脚本需要script2.rb,则该脚本文件中的$0也将是script1.rb。名称$0反映了UNIX shell脚本中用于相同目的的命名约定。
  • $*-数组中的命令行参数由$*(美元符号和星号)表示。例如,如果要运行/script.rbarg1 arg2,则$*等于%w{arg1 arg2}。这相当于特殊的ARGV数组,描述性名称较少,因此很少使用。
  • $$-解释器's进程ID,用$$表示(两美元的符号)。了解一个'自己的进程ID在daemon程序(在背景中运行,与任何终端无关)或系统服务中通常很有用。但是,当涉及线程时,这会变得更加复杂,所以要小心盲目使用它。
  • $/和$\-这些是输入和输出记录分隔符。当您使用get读取对象并使用put打印对象时,它使用这些来知道何时读取完整的"记录"或在多个记录之间打印什么。默认情况下,这些应该是newline字符。但由于这些会影响所有IO对象的行为,因此它们'如果有的话,很少使用。您可以在较小的脚本中看到它们,其中打破封装规则不是问题。
  • $?-执行的最后一个子过程的退出状态。在这里列出的所有变量中,这可能是最有用的。其原因很简单:您可以通过系统方法中的返回值获取子进程的退出状态,只有真或假。如果你必须知道实际的回报子过程的价值,您需要使用这个特殊的全局变量。同样,这个变量的名称取自UNIX shell。
  • $82>-最后一个由读取的字符串得到。对于那些从Perl来到Ruby的人来说,这个变量可能会引起混淆。在Perl中,$_variable意味着类似但完全不同的东西。在Perl中,保留last语句的值,在Ruby中保留前一个get调用返回的字符串。它们的用法是相似的,但它们真正持有的是非常不同的。你也经常看到这个变量(想到它,你很少看到任何这些变量),但是你可能会在处理文本的非常短的Ruby程序中看到它们。

简而言之,你很少看到全局变量。他们'经常是不好的形式(和"联合红宝石"),并且只适用于非常小的脚本,在这些脚本中可以充分理解其使用的全部含义。可以使用一些特殊的全局变量,但在大多数情况下,它们都是't使用的。你确实需要了解所有关于全局变量的知识来理解大多数红宝石程序,但你至少应该知道它们'在那里。

教育_1