2017-08-27 39 views
0

我遇到Map s的奇怪問題。這裏有一個小例子來重現問題:Map.get無法使用字符串鍵檢索值

defmodule Document do 

    @expiration_presets_to_timeshift %{ 
    "immediately": [seconds: 1], 
    "1-minute": [minutes: 1], 
    "1-hour": [hours: 1], 
    "1-day": [days: 1], 
    "1-week": [weeks: 1], 
    "1-month": [months: 1], 
    "1-year": [years: 1], 
    "never": [years: 9999], 
    } 

    def expiration_presets, do: @expiration_presets_to_timeshift 
end 

如果我們再嘗試檢索從地圖信息:

iex(1)> import Document 
Document 
iex(2)> Document.expiration_presets 
%{"1-day": [days: 1], "1-hour": [hours: 1], "1-minute": [minutes: 1], 
"1-month": [months: 1], "1-week": [weeks: 1], "1-year": [years: 1], 
immediately: [seconds: 1], never: [years: 9999]} 
iex(3)> Document.expiration_presets["1-hour"] 
nil 
iex(4)> Map.get(Document.expiration_presets, "1-hour") 
nil 

我發現兩個奇怪的行爲:

  1. 的「立即」和「從不」鍵已經成爲原子。我從來沒有要求過這個。爲什麼?
  2. 我似乎無法使用密鑰字符串檢索值(Map.get/2Map.[key]均返回nil)。爲什麼會這樣,我如何從地圖中檢索出值?

回答

2

字符串鍵地圖語法如下:

%{"immediately" => [seconds: 1]} 

更新您的地圖第一次使用該樣式。

而且功能缺少:

def expiration_presets, do: @expiration_presets_to_timeshift 
+1

謝謝!我沒有注意到'key => value'與'atom:value'的關鍵區別! – achedeuzot