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 ""
多的好處,認真要說,多的好處應該是可以在字串中使用雙引號。
謝謝饅頭貓的更正:)已修改!!