Opa / Opalang: установка или доступ к метке поля записи с привязкой

В javascript можно получить или установить значения в объекте, используя нотацию с точкой или квадратной скобкой, например, в:

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

      }

    }

  }

На данный момент я не вижу никакого способа установить new_cell_data со значениями, отличными от flower_hierarchy, без полной репликации функции для установки других полей.


opa
person user3252962    schedule 30.01.2014    source источник


Ответы (2)


Opa и Javascript очень сильно отличаются по философии. Javascript — это динамический язык, не обеспечивающий безопасность типов. Когда вы делаете что-то вроде a[b], вы должны убедиться, что поле, на которое ссылается переменная b, существует в объекте a, иначе вы получите undefined.

Opa, с другой стороны, безопасен для типов и гарантирует, что все выражения «имеют смысл»; вам не нужно беспокоиться о неопределенных значениях.

Итак, короткий ответ: в Опе нет a[b]. Однако я вполне уверен, что то, что вы пытаетесь сделать, можно изящно выразить на языке. Можете ли вы объяснить словами, что вы хотите, чтобы функция set_flower_hierarchy делала? (это не ясно для меня, просто глядя на фрагмент).

person akoprowski    schedule 01.02.2014

Спасибо за Ваш ответ. На данный момент я не могу слишком много рассказывать о своей работе, но, не желая описывать ее как «элегантную» (хотя язык, безусловно, таков), вот более удовлетворительный способ выразить то, что я пытался сделать.

Во-первых, мне нужно было определить вариантный тип, содержащий разные значения, которые я хочу установить в ячейке, чтобы его можно было сопоставить с шаблоном, и компилятор не жаловался на неудовлетворенные случаи. В этом случае дополнительное значение называется «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

      }

    }

  }
person user3252962    schedule 03.02.2014