- hello.rb
print "Hello, ", ARGV[0], "\n"
如下執行指令載入指令稿直譯並執行:
>
ruby
hello.rb
caterpillar
Hello!caterpillar!
>
Hello!caterpillar!
>
上面這個範例可以更簡潔地寫為以下:
- hello.rb
puts "Hello, #{ARGV[0]}"
如果字串中包括#{},括號中若指定了某個變數名稱,則 直譯器會嘗試取得變數值後與字串結合。預設輸出會使用標準輸出STDOUT, 如果想使用標準錯誤輸出,可以指定STDERR。例如:
- hello.rb
STDERR.print "Hello, #{ARGV[0]}"
在程式執行的過程中,可以使用gets方法取得使用者的輸 入,使用者 輸入文字後按下Enter,gets會 以字串傳回使用者的輸入,取得的字串會包括換行字元。例如:
- hello.rb
print "Input your name: "
name = gets
puts "Hello, #{name}!"
如下執行指令載入指令稿直譯並執行:
>ruby
main.rb
Input your name: Justin
Hello, Justin
!
>
Input your name: Justin
Hello, Justin
!
>
注意最後一個行才出現!, 這是因為name變 數參考的字串,最後包括空白字元。如果想裁剪掉字串尾端空白字元,像是換行字元,可以使用字串物件的chomp方 法。例如:
- hello.rb
print "Input your name: "
name = gets.chomp
puts "Hello, #{name}!"
執行結果如下,!會緊接在同一行後,這是因為name變數參考的字串尾端空白已被chomp裁掉:
>ruby
main.rb
Input your name: Justin
Hello, Justin!
>
Input your name: Justin
Hello, Justin!
>
到目前為止,輸出都是使用print 或puts方法,print方法可以使用逗號區隔想輸出的文字,如第一個範例所示,puts也可以,不過要注意,每個文字都會被換行。例如:
- main.rb
puts "This ", "is ", "a ", "test", "!"
執行結果如下:
>ruby
main.rb
This
is
a
test
!
>
This
is
a
test
!
>
如果要格式化輸出,可以使用printf方法。例如:
>>
printf("%d %.2f %s\n", 1, 99.3, "Justin")
1 99.30 Justin
=> nil
>>
1 99.30 Justin
=> nil
>>
格式化輸出時,所使用的%d、%f、%s等與C語言類似,如果只是要格式化字串,則可以使用sprintf方 法。例如:
>>
x = sprintf "%d %.2f %s", 1, 99.3, "Justin"
=> "1 99.30 Justin"
>> puts x
1 99.30 Justin
=> nil
>>
=> "1 99.30 Justin"
>> puts x
1 99.30 Justin
=> nil
>>
格式化字串另一個簡便的方式,是透過%與陣列,例如:
>>
x = "%d %.2f %s" % [1, 99.3, "Justin"]
=> "1 99.30 Justin"
>> puts x
1 99.30 Justin
=> nil
>>
=> "1 99.30 Justin"
>> puts x
1 99.30 Justin
=> nil
>>
如果要將使用者的輸入字串轉換為整數、浮點等型態,可以使用to_i、to_f方 法。例如:
>>
"1".to_i
=> 1
>> "3.14".to_f
=> 3.14
>> "3.14".to_f + 123
=> 126.14
>>
=> 1
>> "3.14".to_f
=> 3.14
>> "3.14".to_f + 123
=> 126.14
>>
to_i、to_f方法比較寬鬆,如果字串後段混有非數字部份,只會對數字部份予以剖析,如果不想要這個結果,可以使用Integer或Float。 例如:
>>
"123one".to_i
=> 123
>> Integer("123one")
ArgumentError: invalid value for Integer(): "123one"
from (irb):2:in `Integer'
from (irb):2
from C:/Winware/Ruby192/bin/irb:12:in `<main>'
>> "3.14abc".to_f
=> 3.14
>> Float("3.14abc")
ArgumentError: invalid value for Float(): "3.14abc"
from (irb):5:in `Float'
from (irb):5
from C:/Winware/Ruby192/bin/irb:12:in `<main>'
>>
=> 123
>> Integer("123one")
ArgumentError: invalid value for Integer(): "123one"
from (irb):2:in `Integer'
from (irb):2
from C:/Winware/Ruby192/bin/irb:12:in `<main>'
>> "3.14abc".to_f
=> 3.14
>> Float("3.14abc")
ArgumentError: invalid value for Float(): "3.14abc"
from (irb):5:in `Float'
from (irb):5
from C:/Winware/Ruby192/bin/irb:12:in `<main>'
>>
gets方法是從標準輸入STDIN取得字串,如果想要讀取檔 案,可以使用File.read方法。例如:
- main.rb
print "File name: "
name = gets.chomp
content = File.read(name)
puts content
File.read會一次 讀取檔案所有內容,如果想要逐行讀取檔案內容,可以使用open方 法。例如:
- main.rb
print "File name: "
name = gets.chomp
file = open(name, "r") # "r" 表示檔案供讀取使用
while line = file.gets
print line
end
file.close
gets若 讀到檔案結束,會傳回nil, 這在布林判斷時會作為不成立,因此離開迴圈,在 不使用檔案時,可以使用close將檔案關閉以節省資源。另 一個比較簡潔的方式,是使用區塊方式撰寫讀取邏輯。例如:
- main.rb
print "File name: "
name = gets.chomp
file = open(name, "r")
file.each do |line|
print line
end
file.close
open之後傳回的物件, 會有each方法,會將讀入的每一行設定給|line|中的line,open本身也有區塊式寫法。例如:
- main.rb
print "File name: "
name = gets.chomp
open(name, "r") do |file|
file.each do |line|
print line
end
end
open之後傳回的物件,會指定給|file|中的file參考,執行完區塊後會自動關閉檔案。區塊寫法牽涉到迭代器等細節,現階段你只要記得有這種 寫法,技術細節在之後的文件還會介紹。
如果要寫資料至檔案,則在 使用open方法時,指定模式為"w",並使用print、puts等 方法進行資料寫入。例如:
print "File name: "
name = gets.chomp
open(name, "w") do |file|
file.print "test"
end
如果要以位元組方式讀入檔案,可以使用File實例的each_byte讀入位元組資料,如果要寫出位元組資料至檔案,可以使用File物件的 print方法,將包括位元組內容的字串寫出。例如:
- main.rb
print "Src: "
src = gets.chomp
print "Dest: "
dest = gets.chomp
open(src, "rb") do |r_file|
open(dest, "wb") do |w_file|
r_file.each_byte do |byte|
w_file.print([byte].pack("c*"))
end
end
end
其中b指定用二進位方式開檔,pack是Array實例的方法,指定"c*"表示將位元組資料包裝為字串(ASCII-8BIT)。如果需要更低階的 操作,可以使用繼承自IO物件的 sysread 與 syswrite 方法。
有關於不同編碼的檔案讀寫,則可以參考 關於編碼。