iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
3
Modern Web

30天修煉Ruby面試精選30題系列 第 18

Day18 - 來用Ruby裡的多行字串寫首美麗的詩!

Ruby經典面試題目 #18

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)rubyc語言引進的概念,

第一個<<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:


上一篇
Day17 - Ruby比一比: 喊水會結凍的freeze和frozen?
下一篇
Day19 - 活用Ruby裡的yield
系列文
30天修煉Ruby面試精選30題31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Bater
iT邦新手 4 級 ‧ 2018-10-21 10:07:09

百分比+大括號符號組合也有相同的多行/斷行功能,而且比單單純純的puts多了一個好處,就是可以代入變數:

這句話有問題喔,代入變數並不是百分比大括號組合比puts多的好處,也不是比puts ""多的好處,認真要說,多的好處應該是可以在字串中使用雙引號。

謝謝饅頭貓的更正:)已修改!!

我要留言

立即登入留言