局部變量由小寫(xiě)字母或下劃線(_)開(kāi)頭.局部變量不像全局和實(shí)變量一樣在初始化前含nil值.
ruby>?$foo
???nil
ruby>?@foo
???nil
ruby>?foo
ERR:?(eval):1:?undefined?local?variable?or?method?`foo'?for?main(Object)?
對(duì)局部變量的第一次賦值做的很像一次聲明.如果你指向一個(gè)未初始化的局部變量,Ruby解釋器會(huì)認(rèn)為那是一個(gè)方法的名字;正如上面所見(jiàn)錯(cuò)誤
信息的.
一般的,局部變量的范圍會(huì)是
proc{...}?
loop{...}?
def...end?
class...end?
module...end?
整個(gè)程序(除非符合上面某個(gè)條件)
下面的例子,define?是一個(gè)檢查標(biāo)識(shí)符是否已定義的操作符.如果已定義它將返回標(biāo)識(shí)符的描述,否則返回nil.正如你所見(jiàn)的,bar的范圍是
loop的局部變量;當(dāng)loop退出時(shí),bar無(wú)定義.
ruby>?foo?=?44;?print?foo,?"\n";?defined??foo
44
???"local-variable"
ruby>?loop{bar=45;?print?bar,?"\n";?break};?defined??bar
45
???nil?
一個(gè)范圍內(nèi)的過(guò)程對(duì)象共享這個(gè)范圍內(nèi)的局部變量.這里,局部變量?bar?由?main?和過(guò)程對(duì)象?p1,?p2共享:
ruby>?bar=0
???0
ruby>?p1?=?proc{|n|?bar=n}
???#<Proc:0x8deb0>
ruby>?p2?=?proc{bar}
???#<Proc:0x8dce8>
ruby>?p1.call(5)
???5
ruby>?bar
???5
ruby>?p2.call
???5?
注意開(kāi)始的"bar=0"不能省略;此賦值允許bar的范圍被?p1和?p2共享.不然?p1,?p2?將會(huì)分別生成并處理它們自己的局部變量?bar,?調(diào)用?p2?
也將導(dǎo)致"未定義局部變量或方法"錯(cuò)誤.
過(guò)程對(duì)象的強(qiáng)大在于它們能被作為參數(shù)傳遞:共享的局部變量即使傳遞出原范圍也仍然有效.
ruby>?def?box
????|???contents?=?15
????|???get?=?proc{contents}
????|???set?=?proc{|n|?contents?=?n}
????|???return?get,?set
????|?end
???nil
ruby>?reader,?writer?=?box
???[#<Proc:0x40170fc0>,?#<Proc:0x40170fac>]?
ruby>?reader.call
???15
ruby>?writer.call(2)
???2
ruby>?reader.call
???2?
Ruby對(duì)待范圍的辦法相當(dāng)聰明.顯然,上面例子里?contents?變量是由?reader?和?writer?共享的.我們也可以像上面那樣創(chuàng)造多對(duì)使用box的
reader-writer;每一對(duì)共享一個(gè)?contents?變量,對(duì)之間不相干擾.
ruby>?reader_1,?writer_1?=?box
???[#<Proc:0x40172820>,?#<Proc:0x4017280c>]
ruby>?reader_2,?writer_2?=?box
???[#<Proc:0x40172668>,?#<Proc:0x40172654>]
ruby>?writer_1.call(99)
???99
ruby>?reader_1.call
???99
ruby>?reader_2.call
???15?
版權(quán)聲明:RUBY文檔中心的所有文章標(biāo)明[原創(chuàng)]的均為本站作品,版權(quán)屬RUBY中文化計(jì)劃,若轉(zhuǎn)載請(qǐng)注明;標(biāo)明[翻譯]的其外文版權(quán)歸原作者,譯文版權(quán)屬RUBY中文化計(jì)劃;標(biāo)明[轉(zhuǎn)貼]的,若原作者感到侵犯了他的著作權(quán),那么請(qǐng)及時(shí)跟主持人聯(lián)系,我們會(huì)盡快更正。
?