Ruby 迭代器及文件的輸入與輸出
前言
本章介紹Ruby的迭代器和文件的輸入與輸出。
Ruby 迭代器
簡單來說:迭代(iterate)指的是重復(fù)做相同的事,所以迭代器(iterator)就是用來重復(fù)多次相同的事。
迭代器是集合支持的方法。存儲一組數(shù)據(jù)成員的對象稱為集合。在 Ruby 中,數(shù)組(Array)和哈希(Hash)可以稱之為集合。
迭代器返回集合的所有元素,一個接著一個。在這里我們將討論兩種迭代器,each 和 collect。
Ruby each 迭代器
each 迭代器返回數(shù)組或哈希的所有元素。
語法
collection.each do |variable| code end
為集合中的每個元素執(zhí)行 code。在這里,集合可以是數(shù)組或哈希。
實例
#!/usr/bin/ruby ary = [1,2,3,4,5] ary.each do |i| puts i end
以上實例運行輸出結(jié)果為:
1 2 3 4 5
each 迭代器總是與一個塊關(guān)聯(lián)。它向塊返回數(shù)組的每個值,一個接著一個。值被存儲在變量 i 中,然后顯示在屏幕上。
Ruby collect 迭代器
collect 迭代器返回集合的所有元素。
語法
collection = collection.collect
collect 方法不需要總是與一個塊關(guān)聯(lián)。collect 方法返回整個集合,不管它是數(shù)組或者是哈希。
實例
#!/usr/bin/ruby a = [1,2,3,4,5] b = Array.new b = a.collect{ |x|x } puts b
以上實例運行輸出結(jié)果為:
1 2 3 4 5
注意:collect 方法不是數(shù)組間進(jìn)行復(fù)制的正確方式。這里有另一個稱為 clone 的方法,用于復(fù)制一個數(shù)組到另一個數(shù)組。
當(dāng)您想要對每個值進(jìn)行一些操作以便獲得新的數(shù)組時,您通常使用 collect 方法。例如,下面的代碼會生成一個數(shù)組,其值是 a 中每個值的 10 倍。
實例
#!/usr/bin/ruby a = [1,2,3,4,5] b = a.collect{|x| 10*x} puts b
以上實例運行輸出結(jié)果為:
10 20 30 40 50
Java需要把Map轉(zhuǎn)化成List類型的容器才能使用迭代器,但Ruby有直接針對Map的迭代器:
sum = 0 cutcome = {"block1" => 1000, "book2" => 1000, "book3" => 4000} cutcome.each{|item, price| sum += price} print "sum = " + sum.to_s
甚至還可以這樣:
sum = 0 cutcome = {"block1" => 1000, "book2" => 1000, "book3" => 4000} cutcome.each{|pair| sum += pair[1]} print "sum = " + sum.to_s
Ruby 文件的輸入與輸出
Ruby 提供了一整套 I/O 相關(guān)的方法,在內(nèi)核(Kernel)模塊中實現(xiàn)。所有的 I/O 方法派生自 IO 類。
類 IO 提供了所有基礎(chǔ)的方法,比如 read、 write、 gets、 puts、 readline、 getc 和 printf。
本章節(jié)將講解所有 Ruby 中可用的基礎(chǔ)的 I/O 函數(shù)。如需了解更多的函數(shù),請查看 Ruby 的 IO 類。
puts 語句
在前面的章節(jié)中,您賦值給變量,然后使用 puts 語句打印輸出。
puts 語句指示程序顯示存儲在變量中的值。這將在每行末尾添加一個新行。
實例
#!/usr/bin/ruby val1 = "This is variable one" val2 = "This is variable two" puts val1 puts val2
以上實例運行輸出結(jié)果為:
This is variable one This is variable two
gets 語句
gets 語句可用于獲取來自名為 STDIN 的標(biāo)準(zhǔn)屏幕的用戶輸入。
實例下面的代碼演示了如何使用 gets 語句。該代碼將提示用戶輸入一個值,該值將被存儲在變量 val 中,最后會被打印在 STDOUT 上。
實例
#!/usr/bin/ruby puts "Enter a value :" val = gets puts val
以上實例運行輸出結(jié)果為:
Enter a value : This is entered value This is entered value
putc 語句
與 puts 語句不同,puts 語句輸出整個字符串到屏幕上,而 putc 語句可用于依次輸出一個字符。
實例
下面代碼的輸出只是字符 H:
#!/usr/bin/ruby str="Hello Ruby!" putc str
以上實例運行輸出結(jié)果為:
H
print 語句
print 語句與 puts 語句類似。唯一的不同在于 puts 語句在輸出內(nèi)容后會跳到下一行,而使用 print 語句時,光標(biāo)定位在同一行。
實例
#!/usr/bin/ruby print "Hello World" print "Good Morning"
以上實例運行輸出結(jié)果為:
Hello WorldGood Morning
打開和關(guān)閉文件
截至現(xiàn)在,您已經(jīng)讀取并寫入標(biāo)準(zhǔn)輸入和輸出?,F(xiàn)在,我們將看看如何操作實際的數(shù)據(jù)文件。
File.new 方法
您可以使用 File.new 方法創(chuàng)建一個 File 對象用于讀取、寫入或者讀寫,讀寫權(quán)限取決于 mode 參數(shù)。最后,您可以使用 File.close 方法來關(guān)閉該文件。
語法
aFile = File.new("filename", "mode") # ... 處理文件 aFile.close
File.open 方法
您可以使用 File.open 方法創(chuàng)建一個新的 file 對象,并把該 file 對象賦值給文件。但是,F(xiàn)ile.open 和 File.new 方法之間有一點不同。不同點是 File.open 方法可與塊關(guān)聯(lián),而 File.new 方法不能。
File.open("filename", "mode") do |aFile| # ... process the file end
下表列出了打開文件的不同模式:
模式 | 描述 |
---|---|
r | 只讀模式。文件指針被放置在文件的開頭。這是默認(rèn)模式。 |
r+ | 讀寫模式。文件指針被放置在文件的開頭。 |
w | 只寫模式。如果文件存在,則重寫文件。如果文件不存在,則創(chuàng)建一個新文件用于寫入。 |
w+ | 讀寫模式。如果文件存在,則重寫已存在的文件。如果文件不存在,則創(chuàng)建一個新文件用于讀寫。 |
a | 只寫模式。如果文件存在,則文件指針被放置在文件的末尾。也就是說,文件是追加模式。如果文件不存在,則創(chuàng)建一個新文件用于寫入。 |
a+ | 讀寫模式。如果文件存在,則文件指針被放置在文件的末尾。也就是說,文件是追加模式。如果文件不存在,則創(chuàng)建一個新文件用于讀寫。 |
讀取和寫入文件
用于簡單 I/O 的方法也可用于所有 file 對象。所以,gets 從標(biāo)準(zhǔn)輸入讀取一行,aFile.gets 從文件對象 aFile 讀取一行。
但是,I/O 對象提供了訪問方法的附加設(shè)置,為我們提供了便利。
sysread 方法
您可以使用方法 sysread 來讀取文件的內(nèi)容。當(dāng)使用方法 sysread 時,您可以使用任意一種模式打開文件。例如:
下面是輸入文本文件:
This is a simple text file for testing purpose.
現(xiàn)在讓我們嘗試讀取這個文件:
實例
#!/usr/bin/ruby aFile = File.new("input.txt", "r") if aFile content = aFile.sysread(20) puts content else puts "Unable to open file!" end
該語句將輸入文件的頭 20 個字符。文件指針將被放置在文件中第 21 個字符的位置。
syswrite 方法
您可以使用方法 syswrite 來向文件寫入內(nèi)容。當(dāng)使用方法 syswrite 時,您需要以寫入模式打開文件。例如:
實例
#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Unable to open file!" end
該語句將寫入 “ABCDEF” 到文件中。
each_byte 方法
該方法屬于類 File。方法 each_byte 是個可以迭代字符串中每個字符。請看下面的代碼實例:
實例
#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") aFile.rewind aFile.each_byte {|ch| putc ch; putc ?. } else puts "Unable to open file!" end
字符一個接著一個被傳到變量 ch,然后顯示在屏幕上,如下所示:
A.B.C.D.E.F.s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
IO.readlines 方法
類 File 是類 IO 的一個子類。類 IO 也有一些用于操作文件的方法。
IO.readlines 是 IO 類中的一個方法。該方法逐行返回文件的內(nèi)容。下面的代碼顯示了方法 IO.readlines 的使用:
實例
#!/usr/bin/ruby arr = IO.readlines("input.txt") puts arr[0] puts arr[1]
在這段代碼中,變量 arr 是一個數(shù)組。文件 input.txt 的每一行將是數(shù)組 arr 中的一個元素。因此,arr[0] 將包含第一行,而 arr[1] 將包含文件的第二行。
IO.foreach 方法
該方法也逐行返回輸出。方法 foreach 與方法 readlines 之間不同的是,方法 foreach 與塊相關(guān)聯(lián)。但是,不像方法 readlines,方法 foreach 不是返回一個數(shù)組。例如:
實例
#!/usr/bin/ruby IO.foreach("input.txt"){|block| puts block}
這段代碼將把文件 test 的內(nèi)容逐行傳給變量 block,然后輸出將顯示在屏幕上。
重命名和刪除文件
您可以通過 rename 和 delete 方法重命名和刪除文件。
下面的實例重命名一個已存在文件 test1.txt:
實例
#!/usr/bin/ruby # 重命名文件 test1.txt 為 test2.txt File.rename( "test1.txt", "test2.txt" )
下面的實例刪除一個已存在文件 test2.txt:
實例
#!/usr/bin/ruby # 刪除文件 test2.txt File.delete("text2.txt")
文件模式與所有權(quán)
使用帶有掩碼的 chmod 方法來改變文件的模式或權(quán)限/訪問列表:
下面的實例改變一個已存在文件 test.txt 的模式為一個掩碼值:
實例
#!/usr/bin/ruby file = File.new( "test.txt", "w" ) file.chmod( 0755 )
下表列出了 chmod 方法中可使用的不同的掩碼:
掩碼 | 描述 |
---|---|
0700 | rwx 掩碼,針對所有者 |
0400 | r ,針對所有者 |
0200 | w ,針對所有者 |
0100 | x ,針對所有者 |
0070 | rwx 掩碼,針對所屬組 |
0040 | r ,針對所屬組 |
0020 | w ,針對所屬組 |
0010 | x ,針對所屬組 |
0007 | rwx 掩碼,針對其他人 |
0004 | r ,針對其他人 |
0002 | w ,針對其他人 |
0001 | x ,針對其他人 |
4000 | 執(zhí)行時設(shè)置用戶 ID |
2000 | 執(zhí)行時設(shè)置所屬組 ID |
1000 | 保存交換文本,甚至在使用后也會保存 |
文件查詢
下面的命令在打開文件前檢查文件是否已存在:
實例
#!/usr/bin/ruby File.open("file.rb") if File::exists?( "file.rb" )
下面的命令查詢文件是否確實是一個文件:
實例
#!/usr/bin/ruby # 返回 true 或false File.file?( "text.txt" )
下面的命令檢查給定的文件名是否是一個目錄:
實例
#!/usr/bin/ruby # 一個目錄 File::directory?( "/usr/local/bin" ) # => true # 一個文件 File::directory?( "file.rb" ) # => false
下面的命令檢查文件是否可讀、可寫、可執(zhí)行:
實例
#!/usr/bin/ruby File.readable?( "test.txt" ) # => true File.writable?( "test.txt" ) # => true File.executable?( "test.txt" ) # => false
下面的命令檢查文件是否大小為零:
實例
#!/usr/bin/ruby File.zero?( "test.txt" ) # => true
下面的命令用于檢查文件的類型:
實例
#!/usr/bin/ruby File::ftype( "test.txt" ) # => file
ftype 方法通過返回下列中的某個值來標(biāo)識了文件的類型:file、 directory、 characterSpecial、 blockSpecial、 fifo、 link、 socket 或 unknown。
下面的命令用于檢查文件被創(chuàng)建、修改或最后訪問的時間:
實例
#!/usr/bin/ruby File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008 File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008 File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008
Ruby 中的目錄
所有的文件都是包含在目錄中,Ruby 提供了處理文件和目錄的方式。File 類用于處理文件,Dir 類用于處理目錄。
瀏覽目錄
為了在 Ruby 程序中改變目錄,請使用 Dir.chdir。下面的實例改變當(dāng)前目錄為 /usr/bin。
Dir.chdir("/usr/bin")
您可以通過 Dir.pwd 查看當(dāng)前目錄:
puts Dir.pwd # 返回當(dāng)前目錄,類似 /usr/bin
您可以使用 Dir.entries 獲取指定目錄內(nèi)的文件和目錄列表:
puts Dir.entries("/usr/bin").join(' ')
Dir.entries 返回一個數(shù)組,包含指定目錄內(nèi)的所有項。Dir.foreach 提供了相同的功能:
Dir.foreach("/usr/bin") do |entry| puts entry end
獲取目錄列表的一個更簡潔的方式是通過使用 Dir 的類數(shù)組的方法:
Dir["/usr/bin/*"]
創(chuàng)建目錄
Dir.mkdir 可用于創(chuàng)建目錄:
Dir.mkdir("mynewdir")
您也可以通過 mkdir 在新目錄(不是已存在的目錄)上設(shè)置權(quán)限:
注意:掩碼 755 設(shè)置所有者(owner)、所屬組(group)、每個人(world [anyone])的權(quán)限為 rwxr-xr-x,其中 r = read 讀取,w = write 寫入,x = execute 執(zhí)行。
Dir.mkdir( "mynewdir", 755 )
刪除目錄
Dir.delete 可用于刪除目錄。Dir.unlink 和 Dir.rmdir 執(zhí)行同樣的功能,為我們提供了便利。
Dir.delete("testdir")
創(chuàng)建文件 & 臨時目錄
臨時文件是那些在程序執(zhí)行過程中被簡單地創(chuàng)建,但不會永久性存儲的信息。
Dir.tmpdir 提供了當(dāng)前系統(tǒng)上臨時目錄的路徑,但是該方法默認(rèn)情況下是不可用的。為了讓 Dir.tmpdir 可用,使用必需的 ‘tmpdir’ 是必要的。
您可以把 Dir.tmpdir 和 File.join 一起使用,來創(chuàng)建一個獨立于平臺的臨時文件:
require 'tmpdir' tempfilename = File.join(Dir.tmpdir, "tingtong") tempfile = File.new(tempfilename, "w") tempfile.puts "This is a temporary file" tempfile.close File.delete(tempfilename)
這段代碼創(chuàng)建了一個臨時文件,并向其中寫入數(shù)據(jù),然后刪除文件。Ruby 的標(biāo)準(zhǔn)庫也包含了一個名為 Tempfile 的庫,該庫可用于創(chuàng)建臨時文件:
require 'tempfile' f = Tempfile.new('tingtong') f.puts "Hello" puts f.path f.close
到此這篇關(guān)于Ruby 迭代器及文件的輸入與輸出的文章就介紹到這了,更多相關(guān)Ruby迭代器及文件輸入輸出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ruby 中的 module_function 和 extend self異同
本文主要給大家介紹了在Ruby中 module_function 和 extend self的共同點和區(qū)別,非常的詳細(xì),也很實用,方便大家更好的理解的module_function 和 extend self2017-05-05升級到mac 10.10之后使用pod出現(xiàn)問題的解決方法
這篇文章主要介紹了升級到mac 10.10之后使用pod出現(xiàn)問題的解決方法,需要的朋友可以參考下2014-07-07Ruby的25個編程細(xì)節(jié)(技巧、實用代碼段)
這篇文章主要介紹了Ruby的25個編程細(xì)節(jié)(技巧、實用代碼段),本文直接給出主題和相應(yīng)代碼,需要的朋友可以參考下2015-05-05Ruby on Rails所構(gòu)建的應(yīng)用程序基本目錄結(jié)構(gòu)總結(jié)
Ruby on Rails是Ruby世界中一家獨大的Web開發(fā)框架,要掌握Rails程序的構(gòu)建,對其目錄結(jié)構(gòu)的了解十分必要,下面就來看一下Ruby on Rails所構(gòu)建的應(yīng)用程序基本目錄結(jié)構(gòu)總結(jié)2016-05-05實例解析Ruby設(shè)計模式編程中Strategy策略模式的使用
這篇文章主要介紹了Ruby設(shè)計模式編程中Strategy策略模式的使用實例,Strategy模式在Ruby on Rails框架開發(fā)中也經(jīng)常用到,需要的朋友可以參考下2016-03-03實例解析Ruby設(shè)計模式開發(fā)中對觀察者模式的實現(xiàn)
這篇文章主要介紹了實例解析Ruby設(shè)計模式開發(fā)中對觀察者模式的實現(xiàn),Ruby中自帶的observer類自然是絕佳的使用示例,需要的朋友可以參考下2016-04-04