溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Ruby迭代器及文件的輸入與輸出實例代碼分析

發(fā)布時間:2023-05-08 15:41:26 來源:億速云 閱讀:90 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“Ruby迭代器及文件的輸入與輸出實例代碼分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Ruby迭代器及文件的輸入與輸出實例代碼分析”文章能幫助大家解決問題。

Ruby 迭代器

簡單來說:迭代(iterate)指的是重復做相同的事,所以迭代器(iterator)就是用來重復多次相同的事。

迭代器是集合支持的方法。存儲一組數(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

以上實例運行輸出結果為:

1
2
3
4
5

each 迭代器總是與一個塊關聯(lián)。它向塊返回數(shù)組的每個值,一個接著一個。值被存儲在變量 i 中,然后顯示在屏幕上。

Ruby collect 迭代器

collect 迭代器返回集合的所有元素。

語法

collection = collection.collect

collect 方法不需要總是與一個塊關聯(lián)。collect 方法返回整個集合,不管它是數(shù)組或者是哈希。

實例

#!/usr/bin/ruby
 
a = [1,2,3,4,5]
b = Array.new
b = a.collect{ |x|x }
puts b

以上實例運行輸出結果為:

1
2
3
4
5

注意:collect 方法不是數(shù)組間進行復制的正確方式。這里有另一個稱為 clone 的方法,用于復制一個數(shù)組到另一個數(shù)組。

當您想要對每個值進行一些操作以便獲得新的數(shù)組時,您通常使用 collect 方法。例如,下面的代碼會生成一個數(shù)組,其值是 a 中每個值的 10 倍。

實例

#!/usr/bin/ruby
 
a = [1,2,3,4,5]
b = a.collect{|x| 10*x}
puts b

以上實例運行輸出結果為:

10
20
30
40
50

Java需要把Map轉化成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 相關的方法,在內(nèi)核(Kernel)模塊中實現(xiàn)。所有的 I/O 方法派生自 IO 類。

類 IO 提供了所有基礎的方法,比如 read、 write、 gets、 puts、 readline、 getc 和 printf。

本章節(jié)將講解所有 Ruby 中可用的基礎的 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

以上實例運行輸出結果為:

This is variable one
This is variable two

gets 語句

gets 語句可用于獲取來自名為 STDIN 的標準屏幕的用戶輸入。

實例下面的代碼演示了如何使用 gets 語句。該代碼將提示用戶輸入一個值,該值將被存儲在變量 val 中,最后會被打印在 STDOUT 上。

實例

#!/usr/bin/ruby
 
puts "Enter a value :"
val = gets
puts val

以上實例運行輸出結果為:

Enter a value :
This is entered value
This is entered value

putc 語句

與 puts 語句不同,puts 語句輸出整個字符串到屏幕上,而 putc 語句可用于依次輸出一個字符。

實例

下面代碼的輸出只是字符 H:

#!/usr/bin/ruby
 
str="Hello Ruby!"
putc str

以上實例運行輸出結果為:

H

print 語句

print 語句與 puts 語句類似。唯一的不同在于 puts 語句在輸出內(nèi)容后會跳到下一行,而使用 print 語句時,光標定位在同一行。

實例

#!/usr/bin/ruby
 
print "Hello World"
print "Good Morning"

以上實例運行輸出結果為:

Hello WorldGood Morning

打開和關閉文件

截至現(xiàn)在,您已經(jīng)讀取并寫入標準輸入和輸出。現(xiàn)在,我們將看看如何操作實際的數(shù)據(jù)文件。

File.new 方法

您可以使用 File.new 方法創(chuàng)建一個 File 對象用于讀取、寫入或者讀寫,讀寫權限取決于 mode 參數(shù)。最后,您可以使用 File.close 方法來關閉該文件。

語法
aFile = File.new("filename", "mode")
   # ... 處理文件
aFile.close

File.open 方法

您可以使用 File.open 方法創(chuàng)建一個新的 file 對象,并把該 file 對象賦值給文件。但是,F(xiàn)ile.open 和 File.new 方法之間有一點不同。不同點是 File.open 方法可與塊關聯(lián),而 File.new 方法不能。

File.open("filename", "mode") do |aFile|
   # ... process the file
end

下表列出了打開文件的不同模式:

模式描述
r只讀模式。文件指針被放置在文件的開頭。這是默認模式。
r+讀寫模式。文件指針被放置在文件的開頭。
w只寫模式。如果文件存在,則重寫文件。如果文件不存在,則創(chuàng)建一個新文件用于寫入。
w+讀寫模式。如果文件存在,則重寫已存在的文件。如果文件不存在,則創(chuàng)建一個新文件用于讀寫。
a只寫模式。如果文件存在,則文件指針被放置在文件的末尾。也就是說,文件是追加模式。如果文件不存在,則創(chuàng)建一個新文件用于寫入。
a+讀寫模式。如果文件存在,則文件指針被放置在文件的末尾。也就是說,文件是追加模式。如果文件不存在,則創(chuàng)建一個新文件用于讀寫。

讀取和寫入文件

用于簡單 I/O 的方法也可用于所有 file 對象。所以,gets 從標準輸入讀取一行,aFile.gets 從文件對象 aFile 讀取一行。

但是,I/O 對象提供了訪問方法的附加設置,為我們提供了便利。

sysread 方法

您可以使用方法 sysread 來讀取文件的內(nèi)容。當使用方法 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)容。當使用方法 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 與塊相關聯(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")

文件模式與所有權

使用帶有掩碼的 chmod 方法來改變文件的模式或權限/訪問列表:

下面的實例改變一個已存在文件 test.txt 的模式為一個掩碼值:

實例
#!/usr/bin/ruby
 
file = File.new( "test.txt", "w" )
file.chmod( 0755 )

下表列出了 chmod 方法中可使用的不同的掩碼:

掩碼描述
0700rwx 掩碼,針對所有者
0400r ,針對所有者
0200w ,針對所有者
0100x ,針對所有者
0070rwx 掩碼,針對所屬組
0040r ,針對所屬組
0020w ,針對所屬組
0010x ,針對所屬組
0007rwx 掩碼,針對其他人
0004r ,針對其他人
0002w ,針對其他人
0001x ,針對其他人
4000執(zhí)行時設置用戶 ID
2000執(zhí)行時設置所屬組 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 方法通過返回下列中的某個值來標識了文件的類型: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。下面的實例改變當前目錄為 /usr/bin。

Dir.chdir("/usr/bin")

您可以通過 Dir.pwd 查看當前目錄:

puts Dir.pwd # 返回當前目錄,類似 /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 在新目錄(不是已存在的目錄)上設置權限:

注意:掩碼 755 設置所有者(owner)、所屬組(group)、每個人(world [anyone])的權限為 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 提供了當前系統(tǒng)上臨時目錄的路徑,但是該方法默認情況下是不可用的。為了讓 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 的標準庫也包含了一個名為 Tempfile 的庫,該庫可用于創(chuàng)建臨時文件:

require 'tempfile'
f = Tempfile.new('tingtong')
f.puts "Hello"
puts f.path
f.close

關于“Ruby迭代器及文件的輸入與輸出實例代碼分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI