2017-08-23 303 views
4

我的目標是用字符串中的值替換散列值。我這樣做是這樣的:紅寶石散列字符串插值

"hello %{name}, today is %{day}" % {name: "Tim", day: "Monday"} 

如果字符串中的哈希缺少一個關鍵:

"hello %{name}, today is %{day}" % {name: "Tim", city: "Lahore"} 

那麼就會拋出一個錯誤。

KeyError: key{day} not found 

預期的結果應該是:

"hello Tim, today is %{day}" or "hello Tim, today is " 

有人能指導我的方向僅替換匹配的密鑰沒有拋出任何錯誤?

+0

是什麼在第二種情況下,即您預期的結果如果鑰匙丟失? – Stefan

+0

感謝您的關注。預期的迴應可以是「你好Tim,今天是%{day}」或者「你好,Tim,今天是」。我認爲第二個將是首選 –

回答

9

使用Ruby 2.3,通過default=設置%榮譽默認值開始:通過default_proc=設置

hash = {name: 'Tim', city: 'Lahore'} 
hash.default = '' 

'hello %{name}, today is %{day}' % hash 
#=> "hello Tim, today is " 

或動態默認值:只有即:day缺少的關鍵是傳遞給

hash = {name: 'Tim', city: 'Lahore'} 
hash.default_proc = proc { |h, k| "%{#{k}}" } 

'hello %{name}, today is %{day}' % hash 
#=> "hello Tim, today is %{day}" 

注PROC。因此,不知道你是否在您的格式字符串中使用%{day}%<day>s這可能會導致不同的輸出:

'hello %{name}, today is %<day>s' % hash 
#=> "hello Tim, today is %{day}" 
+0

這不會工作在紅寶石<2.3 – Tachyons

+0

@Tachyons是正確的,我已經添加了我的答案的要求。 – Stefan

+0

我使用的是ruby 2.1.3,這不起作用。有沒有其他方法可以做到這一點? – Abhishek

1

你可以設置一個默認的哈希值:

h = {name: "Tim", city: "Lahore"} 
h.default = "No key" 
p "hello %{name}, today is %{day}" % h #=>"hello Tim, today is No key" 
1

我有哈希鍵與空間和將鍵轉換爲符號後工作。

哈希具有字符串鍵(它返回上插一個錯誤):

hash = {"First Name" => "Allama", "Last Name" => "Iqbal"} 

轉換哈希鍵符號爲我工作:

hash = {:"First Name" => "Allama", :"Last Name" => "Iqbal"} 
hash.default = '' 

'The %{First Name} %{Last Name} was a great poet.' % hash 

// The Allama Iqbal was a great poet.