2014-01-30 38 views
0

在JavaScript中,它有可能獲得或設置使用點或方括號,例如,在對象的值:OPA/Opalang:設置或訪問記錄字段標籤與結合

var a = {b: "c"}; 
alert(a.b); 
alert(a["b"]); 

兩個警報產生相同的結果。

在Opa中是否有這個方括號表示法的任何等價物,以便您可以使用綁定來設置標記以及記錄字段的值?

我問這個,因爲我有OPA以下代碼:

(User.current_server_user, User.flower_hierarchy -> void) set_flower_hierarchy = 

    function(current_user, flower_hierarchy) { 

    match(current_user.user_data.cell) { 

     case {none}: void 

     case {some: cell}: { 

     server_user_cell_data_opt = Cell.call(cell, {get}) 

     new_cell_data = match(server_user_cell_data_opt) { 

      case {none}: {base_server_user_cell_data with ~flower_hierarchy} 
      case {some: cell_data}: {cell_data with ~flower_hierarchy} 

     } 

     _ = Cell.call(cell, {set: some(new_cell_data)}) 
     void 

     } 

    } 

    } 

此刻,我看不出有比其他flower_hierarchy值設爲new_cell_data的任何方式,不完全複製的功能設置其他領域。

回答

0

Opa和JavaScript在哲學上有很大的不同。 Javascript是一種動態語言,不提供類型安全性。當您在做類似a[b]的事情時,請務必確保該字段指向對象a中的變量b,否則您將獲得undefined

Opa另一方面是類型安全的,並確保所有表達式「有意義」;你不必擔心未定義的值。

所以簡短的回答是:在Opa沒有a[b]。不過,我非常有信心,你所要做的事情可以用語言表達得淋漓盡致。你能用文字解釋你想要set_flower_hierarchy函數做什麼嗎? (我只是看着片段並不清楚)。

0

感謝您的回答。我暫時不能透露我的工作,但不想將其描述爲「優雅」(雖然語言當然是這樣),但這是表達我正在嘗試做的更令人滿意的方式。首先,我需要定義一個包含我要在單元格中設置的不同值的變體類型,以便它可以在沒有編譯器抱怨未滿足的情況下進行模式匹配。在這種情況下,附加價值被稱爲「DBID」:

type User.set_server_user_cell_data = 
    {User.flower_hierarchy flower_hierarchy} or 
    {User.dbid dbid} 

然後我需要一個函數來設置由細胞所含的新紀錄:

private (User.server_user_cell_data, User.set_server_user_cell_data 
    -> User.server_user_cell_data) get_server_user_cell_data_record = 

    function(cell_data, set_cell_data) { 

    match(set_cell_data) { 

     case {~flower_hierarchy}: {cell_data with ~flower_hierarchy} 
     case {~dbid}: {cell_data with ~dbid} 

    } 

    } 

從我原來的「set_flower_hierarchy」函數的代碼然後可以像這樣抽象:

private (User.current_server_user, User.set_server_user_cell_data 
    -> void) set_server_user_cell_field = 

    function(current_user, field) { 

    match(current_user.user_data.cell) { 

     case {none}: void 

     case {some: cell}: { 

     server_user_cell_data_opt = Cell.call(cell, {get}) 

     new_cell_data = match(server_user_cell_data_opt) { 

      case {none}: 
      get_server_user_cell_data_record(base_server_user_cell_data, field) 

      case {some: cell_data}: 
      get_server_user_cell_data_record(cell_data, field) 

     } 

     _ = Cell.call(cell, {set: some(new_cell_data)}) 
     void 

     } 

    } 

    }