Ruby中的全局變量

全局變量是可以從程序中的任何位置訪問的變量,無論范圍如何。他們'用$(美元符號)字符開頭重新表示。然而,全局變量的使用通常被認(rèn)為是"un-Ruby,"你很少會看到它們。

定義全局變量

全局變量的定義和使用與任何其他變量一樣。要定義它們,只需為它們分配一個值并開始使用它們。但是,正如他們的名字所暗示的那樣,從程序中的任何一點(diǎn)分配給全局變量都具有全局意義。以下程序演示了這一點(diǎn)。該方法將修改全局變量,這將影響方法的運(yùn)行方式。

 $速度=10def加速$速度=100結(jié)束def通過?速度?陷阱如果$speed>65#給這個計劃一張超速票結(jié)束結(jié)束加快通過速度陷阱

不受歡迎

那么為什么這個"聯(lián)合國紅寶石"為什么你經(jīng)??吹饺肿兞浚亢喍灾?,它打破了封裝。如果任何一個類或方法可以隨意修改全局變量的狀態(tài)而沒有接口層,則依賴于該全局變量的任何其他類或方法可能以意想不到的方式表現(xiàn)。此外,這種交互可能非常難以調(diào)試。什么修改了這個全局變量,什么時候?您'將查看相當(dāng)多的代碼以找到它是做什么的,并且可以通過不違反封裝規(guī)則來避免。

但那'并不是說全局變量從不生活知識科普用于Ruby。有許多特殊的全局變量具有單個字符名(a-la Perl),可以在整個程序中使用。它們代表程序本身的狀態(tài),并為所有gets方法修改記錄和字段分隔符等操作。

全局變量

  • $0-此變量由$0(that's為零)表示的able保留正在執(zhí)行的頂層腳本的名稱。換句話說,從命令行運(yùn)行的腳本文件,而不是保存當(dāng)前執(zhí)行代碼的腳本文件。因此,如果從命令行運(yùn)行script1.rb,則它將保持script1.rb。如果此腳本需要script2.rb,則該腳本文件中的$0也將是script1.rb。名稱$0反映了UNIX shell腳本中用于相同目的的命名約定。
  • $*-數(shù)組中的命令行參數(shù)由$*(美元符號和星號)表示。例如,如果要運(yùn)行/script.rbarg1 arg2,則$*等于%w{arg1 arg2}。這相當(dāng)于特殊的ARGV數(shù)組,描述性名稱較少,因此很少使用。
  • $$-解釋器's進(jìn)程ID,用$$表示(兩美元的符號)。了解一個'自己的進(jìn)程ID在daemon程序(在背景中運(yùn)行,與任何終端無關(guān))或系統(tǒng)服務(wù)中通常很有用。但是,當(dāng)涉及線程時,這會變得更加復(fù)雜,所以要小心盲目使用它。
  • $/和$\-這些是輸入和輸出記錄分隔符。當(dāng)您使用get讀取對象并使用put打印對象時,它使用這些來知道何時讀取完整的"記錄"或在多個記錄之間打印什么。默認(rèn)情況下,這些應(yīng)該是newline字符。但由于這些會影響所有IO對象的行為,因此它們'如果有的話,很少使用。您可以在較小的腳本中看到它們,其中打破封裝規(guī)則不是問題。
  • $?-執(zhí)行的最后一個子過程的退出狀態(tài)。在這里列出的所有變量中,這可能是最有用的。其原因很簡單:您可以通過系統(tǒng)方法中的返回值獲取子進(jìn)程的退出狀態(tài),只有真或假。如果你必須知道實(shí)際的回報子過程的價值,您需要使用這個特殊的全局變量。同樣,這個變量的名稱取自UNIX shell。
  • $82>-最后一個由讀取的字符串得到。對于那些從Perl來到Ruby的人來說,這個變量可能會引起混淆。在Perl中,$_variable意味著類似但完全不同的東西。在Perl中,$?保留last語句的值,在Ruby中保留前一個get調(diào)用返回的字符串。它們的用法是相似的,但它們真正持有的是非常不同的。你也經(jīng)??吹竭@個變量(想到它,你很少看到任何這些變量),但是你可能會在處理文本的非常短的Ruby程序中看到它們。

簡而言之,你很少看到全局變量。他們'經(jīng)常是不好的形式(和"聯(lián)合紅寶石"),并且只適用于非常小的腳本,在這些腳本中可以充分理解其使用的全部含義。可以使用一些特殊的全局變量,但在大多數(shù)情況下,它們都是't使用的。你確實(shí)需要了解所有關(guān)于全局變量的知識來理解大多數(shù)紅寶石程序,但你至少應(yīng)該知道它們'在那里。

教育_1