Ruby 中的轉譯:%Q, %q, %W, %w, %r, %s, %I, %i, %x
連結書籤: %Q %q %W %w %r %s %I %i %x
有時候滿在意事物的正確做法,特別是語法和標點符號等等比較基本的東西, 私以為一個人社會化的水準很大部分體現在他如何表達和溝通,有沒有餘力照顧閱聽人的感受?
所謂寫作的氣質和水準差異,小弟前一篇拙作盤古之白也有略作探討。
回到正題,前陣子在練習專案中引入了ruby-rubocop,幫忙檢查語法錯誤, 透過套件的提示學到了很多有趣的東西,這其中之一是這種轉譯符號的用法: 整合進編輯器的 rubocop 套件提示說明,慣例上希望我用 %i
或者 %I
來改寫原本的 symbol 陣列: 令程式碼變得再更加精簡一點。
用這個篇幅來整理一下筆記, 首先在終端機打開 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"