- 相關(guān)推薦
三道Ruby面試試題
一、Ruby如何進(jìn)行文件操作
Ruby使用File類(lèi)來(lái)操作文件,可以通過(guò)File.new來(lái)創(chuàng)建一個(gè)File類(lèi)的實(shí)例并打開(kāi)這個(gè)文件。
file = File.new(“testfile”, “r”)
# … process the file
file.close
testfile是想要操作的文件名,”r”說(shuō)明了文件的操作模式為讀取。可以使用”w”表示寫(xiě)入,”rw”表示讀寫(xiě)。
最后要記得關(guān)閉打開(kāi)的文件,確保所有被緩沖的數(shù)據(jù)被寫(xiě)入文件,所有相關(guān)的資源被釋放。
也可以使用File.open來(lái)打開(kāi)文件,open和new的不同是open可以使用其后的代碼塊而new方法則返回一個(gè)File類(lèi)的實(shí)例。
File.open(“testfile”, “r”) do |file|
# … process the file
end
open操作的另一個(gè)優(yōu)點(diǎn)是處理了異常,如果處理一個(gè)文件發(fā)生錯(cuò)誤拋出了
異常的話,那么open操作會(huì)自動(dòng)關(guān)閉這個(gè)文件,下面是open操作的大致實(shí)現(xiàn):
class File
def File.open(*args)
result = f = File.new(*args)
if block_given?
begin
result = yield f
ensure
f.close
end
end
return result
end
end
對(duì)于文件的路徑,Ruby會(huì)在不同的操作系統(tǒng)間作轉(zhuǎn)換。例如,在Windows下,/ruby/sample/test.rb會(huì)被轉(zhuǎn)化為\ruby\sample\test.rb。當(dāng)你使用字符串表示一個(gè)Windows下的文件時(shí),請(qǐng)記住使用反斜線先轉(zhuǎn)義:
“c:\\ruby\\sample\\test.rb”
也可以使用File::SEPARATOR表示不同系操作統(tǒng)的路徑分割符。
二、Ruby如何創(chuàng)建一個(gè)線程
可以使用Thread.new方法去創(chuàng)建一個(gè)線程,可以隨后代碼塊中列出線程執(zhí)行的代碼:
x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” }
a = Thread.new { print “a”; print “b”; sleep 0.2; print “c” }
執(zhí)行結(jié)果為:
ab
上面的示例程序中使用Thread.new創(chuàng)建了二個(gè)線程,線程隨即開(kāi)始運(yùn)行。但是運(yùn)行結(jié)果很奇怪,為什么程序運(yùn)行結(jié)果是“ab”呢?我們預(yù)期的執(zhí)行結(jié)果應(yīng)該是 “abxyzc”。
當(dāng)Ruby程序執(zhí)行完畢的時(shí)候,他會(huì)殺掉所有的線程,不管其它的線程的運(yùn)行狀態(tài)如何。如果沒(méi)有使用join方法,那么主程序執(zhí)行完畢后會(huì)把所有沒(méi)有執(zhí)行完畢的線程殺掉。
上面的實(shí)例程序中,當(dāng)主程序運(yùn)行完畢時(shí),兩個(gè)線程都沒(méi)有運(yùn)行結(jié)束就被中止掉了。我們可以使用join方法來(lái)讓主程序等待某個(gè)特定線程結(jié)束,對(duì)每一個(gè)線程使用join方法,可以確保在程序結(jié)束前所有的線程可以運(yùn)行完畢。
x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” }
a = Thread.new { print “a”; print “b”; sleep 0.2; print “c” }
x.join
a.join
我們使用Thread.new方法創(chuàng)建兩個(gè)新的線程并開(kāi)始運(yùn)行, 然后使用join方法等待線程結(jié)束。執(zhí)行結(jié)果為:
abxyzc
可以看到通過(guò)使用join方法等待線程結(jié)束,程序運(yùn)行結(jié)果和我們預(yù)期結(jié)果相符。
另一個(gè)例子:
x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” }
a = Thread.new { sleep 0.1; print “a”; print “b”; sleep 0.2; print “c” }
執(zhí)行沒(méi)有任何輸出,因?yàn)橹鞒绦驁?zhí)行完畢殺死兩個(gè)線程的時(shí)候這兩個(gè)線程沒(méi)有運(yùn)行到輸出語(yǔ)句。
也可以給join方法添加時(shí)間用來(lái)指明最大等待時(shí)間。如果超時(shí)join返回nil。
x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” }
a = Thread.new { sleep 0.1; print “a”; print “b”; sleep 10; print “c” }
x.join(5)
a.join(5)
執(zhí)行結(jié)果為:
abxyz
上面的例子中對(duì)于每一個(gè)線程的最大等待時(shí)間是5秒,由于a線程需要執(zhí)行10秒以上,所以a線程沒(méi)有運(yùn)行完畢程序就將返回。
三、ruby如何進(jìn)行集成操作?Ruby能進(jìn)行多重繼承嗎?
Ruby繼承的語(yǔ)法很簡(jiǎn)單,使用 < 即可。
Ruby語(yǔ)言只支持單繼承,每一個(gè)類(lèi)都只能有一個(gè)直接父類(lèi)。這樣避免了多繼承的復(fù)雜度。但同時(shí),Ruby提供了mixin的機(jī)制可以用來(lái)實(shí)現(xiàn)多繼承。
可以使用super關(guān)鍵字調(diào)用對(duì)象父類(lèi)的方法,當(dāng)super省略參數(shù)時(shí),將使用當(dāng)前方法的參數(shù)來(lái)進(jìn)行調(diào)用。