Day18 如何在Ruby寫下多行字串? How to write multiline string in Ruby?
puts多行字串在Ruby,表達多行字串是很容易的,只要用puts加上空行(Enter健)即可。立馬來用換行功能吟詩作對一下吧!
puts "
那
達達的馬蹄聲
是個
美麗的錯誤"
Output:
tingdeMacBook-Air:Ironman tingtinghsu$ ruby multiline.rb
那
達達的馬蹄聲
是個
美麗的錯誤
嗯嗯恩~好詩!好詩!
%{}多行字串百分比+大括號符號組合也有相同的多行/斷行功能,而且比單單純純的puts多了可以在字串中使用雙引號的好處:
year = 1954
puts %{鄭愁予
"錯誤"
寫於#{year}年}
Output:
鄭愁予
"錯誤"
寫於1954年
%Q{}與%q{}多行字串我們通常會在%{}中間加入一個大寫Q,變成%Q{},作用和%{}是一樣的:
year = 1954
puts %Q{鄭愁予
"錯誤"
寫於#{year}年}
%Q和%{}都可以幫我們處理跳脫字元、特殊符號如#、單引號、雙引號的問題。
puts %Q[ 大寫Q + 中括弧:
鄭愁予
"錯誤"
寫於#{year}年。It's a masterpiece!]
Output:
大寫Q + 中括弧:
鄭愁予
"錯誤"
寫於1954年。It's a masterpiece!
包夾符號其實也可以任意使用大括弧{}、中括弧[],或小括弧()。(不過慣例上還是{}較常用呢!)
換成小寫的%q試試:
puts %q(小寫q + 小括弧:
鄭愁予
'錯誤'
寫於#{year}年。It's a masterpiece!)
Output:
小寫q+ 小括弧:
鄭愁予
'錯誤'
寫於#{year}年。It's a masterpiece!
使用%q時,代表年份的變數#{year}無法被識別。
<<EOF多行字串還記得我們在昨天的文章用<<將變數的值改變嗎?
如果要把這段詩句寫成一個print_poet方法,我們可以在puts後面加上 <<EOF以及EOF做結尾:
def print_poet
puts <<EOF
那
達達的馬蹄聲
是個
美麗的錯誤
EOF
end
print_poet
EOF (End of File)是ruby從c語言引進的概念,
第一個
<<EOF:表示把內容當作標準輸入程式stdin (Standard Input)
第二個
EOF:表示自己定義的"文字流"(stream)的終止。在以上的例子中,我的文字流是一首詩。
結果顯示:
tingdeMacBook-Air:Ironman tingtinghsu$ ruby multiline.rb
那
達達的馬蹄聲
是個
美麗的錯誤
我們如果希望def...end方法內的程式碼也能符合縮排原則,那就來實驗看看將puts <<EOF前加上縮排,能不能執行:
def print_poet
puts <<EOF # syntax error, unexpected end-of-input
那
達達的馬蹄聲
是個
美麗的錯誤
EOF
end
print_poet #can't find string "EOF" anywhere before EOF
燈等!在程式的第二行出現了語法錯誤unexpected end-of-input。
<<-EOF多行字串,提供縮排功能解法很簡單,如果我們要考慮縮排情形的話,在EOF年多加上-減號就行了:
def print_poet
puts <<-EOF
那
達達的馬蹄聲
是個
美麗的錯誤
EOF
end
<<後的字串當作變數<<後面的大寫字串,也可以用比較好理解的變數名稱(不一定要用EOF);
可以進一步用*做運算:
puts <<TimesThree * 3
很重要所以說3次!
TimesThree
Ruby很有趣吧!
很重要所以說3次!
很重要所以說3次!
很重要所以說3次!
或是用+串接:
puts <<LineOne + <<LineTwo
那 達達的馬蹄聲
LineOne
是個 美麗的錯誤
LineTwo
結果把兩行詩加在一起了:
那 達達的馬蹄聲
是個 美麗的錯誤
<<String與Method合併使用文章最後,我們來實現多行字串與方法的結合吧!而且這次要代入2個參數進去:
def ironman_log (integer, string)
puts "第#{integer}天主題: #{string}"
end
ironman_log 18, "multiline"
ironman_log方法幫我們hightlight今天這篇文章的重點。
Output:
第18天主題: multiline
那,string變數可不可以代入多行字串呢?
當然可以~~多行字串也是字串呀!
(就像糖炒栗子也是栗子?一樣,毋須懷疑):
ironman_log 18, <<POET
那
達達的馬蹄聲
是個
美麗的錯誤
我
不是詩人
是個新手工程師
:)
POET
我不是詩人,是個工程師:)
tingdeMacBook-Air:Ironman tingtinghsu$ ruby multiline.rb
第18天主題:
那
達達的馬蹄聲
是個
美麗的錯誤
我
不是詩人
是個新手工程師
:)
Ref:
百分比+大括號符號組合也有相同的多行/斷行功能,而且比單單純純的puts多了一個好處,就是可以代入變數:
這句話有問題喔,代入變數並不是百分比大括號組合比puts多的好處,也不是比puts ""多的好處,認真要說,多的好處應該是可以在字串中使用雙引號。
謝謝饅頭貓的更正:)已修改!!