2015-01-04 89 views
4

我無法理解什麼是下面的代碼片段是做紅寶石%運營商

"foo = %{foo}" % { :foo => 'bar' } 
=> "foo = bar" 

所以理解爲「foo =%{}富」是格式規範,但在這種情況下它似乎使用%{foo}?執行變量插值

+1

希望示例代碼片段更好;左邊的foo讓我困惑了一段時間。如果可能,請嘗試將其更改爲其他內容,這可能會使片段更清晰。 – 2015-01-04 14:51:22

回答

2

String#%使用給定的字符串作爲格式規範,並應用參數(數組/散列)並返回結果字符串。

%{...}是通過名稱格式的參考。還有%<...>還需要哪些格式樣式(S,d,F,...)

"foo = %{key}" % { :key => 'bar' } 
# => "foo = bar" 
"foo = %<key>s" % { :key => 'bar' } 
# => "foo = bar" 

有關格式規範詳情見Kernel#sprintf

2

docString#%是指sprintf

sprintf的文檔末尾,您會找到兩種使用名稱(使用散列參數)替代位置(使用數組參數)的替換類型的簡要說明。

1

解釋是這樣的簡單的方法是看線,這是一個字符串(foo = %{foo})的第一部分,%符號從而意味着字符串的%方法(String#%),所以文字是實際上是格式規範的第一部分,字符串是如何呈現的。 %之後的部分必須是一個數組或哈希,在這種情況下,哈希將執行一個命名替換,這意味着key是必須出現在哈希中的鍵的名稱,返回值bar

你可以用普通的替換來寫這個,但是你需要兩行代碼。

hash = { :key => 'bar' } 
"foo = #{hash[:key]}" 

或者只使用一個變量

foo = "bar" 
"foo = #{foo}" 

其中如果不出意外涉及的是更具可讀性。