連結書籤:%Q%q%W%w%r%s%I%i%x

有時候滿在意事物的正確做法,特別是語法和標點符號等等比較基本的東西, 私以為一個人社會化的水準很大部分體現在他如何表達和溝通,有沒有餘力照顧閱聽人的感受?

所謂寫作的氣質和水準差異,小弟前一篇拙作盤古之白也有略作探討。

paragraph break

回到正題,前陣子在練習專案中引入了ruby-rubocop,幫忙檢查語法錯誤, 透過套件的提示學到了很多有趣的東西,這其中之一是這種轉譯符號的用法: before rubocop 整合進編輯器的 rubocop 套件提示說明,慣例上希望我用 %i 或者 %I 來改寫原本的 symbol 陣列: after rubocop 令程式碼變得再更加精簡一點。

用這個篇幅來整理一下筆記, 首先在終端機打開 irb ,定義一個字串變數讓接下來的範例使用:

$ irb
2.6.0 :001 > foo = 'hello'

%Q

用來取代雙引號(double quotation mark) "" 包覆住的 string 寫法,當一段 string 之中有用到雙引號時特別有用。

%Q(John said: "Frank said: "#{foo}"")
#=> "John said: \"Frank said: \"hello\"\""

非字母或數字的字元皆可取代()

%Q-John said: "Frank said: "#{foo}""-
%Q+John said: "Frank said: "#{foo}""+

因為很常用,Q 也可以省略掉,只需要 %

%+John said: "Frank said: "#{foo}""+

%q

代表單引號('')的用法,不支援字串插值 (string interpolation):

%q(Joe said: 'Frank said: '#{foo}'')
#=> "Joe said: 'Frank said: '\#{foo}''"

%W

代表陣列包覆的字串:

%W(#{foo} Bar Bar\ with\ space 123)
#=> ["hello", "Bar", "Bar with space", "123"]

%w

%q 類似,代表用單引號包住的字串陣列:

%w(#{foo} Bar Bar\ with\ space 123)
#=> ["\#{foo}", "Bar", "Bar with space", "123"]

%r

用在正則表達式(regular expression):

%r(/#{foo}/ world)
#=> /\/hello\/ world/

%s

轉譯符號,但對表達式或其他轉譯序列無效。

%s(foo bar)
#=> :"foo bar"

%s(#{foo} bar)
#=> :"\#{foo} bar"

%s(:foo)
#=> :":foo"

%s(\n)
#=> :"\\n"

%I

符號陣列,類似 %Q 會轉譯內容:

%I(a b #{foo})
#=> [:a, :b, :hello]

%i

符號陣列,類似 %q

%i(a b #{foo})
#=> [:a, :b, :"\#{foo}"]

%x

和 (`) backtick 的功能一樣,讓你可以在 Ruby 中執行 Shell 語法:

%x(echo foo: #{foo})
#=> "foo: hello\n"

# 但 robocop 會推薦你使用 (``) ,效果相同卻更加簡潔。
`echo foo: #{foo}`
#=> "foo: hello\n"

參考

Simple Ruby on Rails 程式碼範例

⤧  Previous post 盤古之白 ⤧  Next post Angular Module 簡介筆記