Статические поля Moonscript

Я хочу сделать такой класс:

class Example
  field: false --some field shared for all instances of the class
  init: (using field) ->
    field = true --want to change value of the static field above

Но в Луа я получил:

<...>
field = false,
init = function()
  local field = true //Different scopes of variable field
end
<...>

В документации я прочитал, что написание с использованием помогает справиться с этим

1 ответ

Решение

Вы можете изменить значение, как вы описали, отредактировав метатабель из экземпляра:

class Example
  field: false
  init: ->
    getmetatable(@).field = true

Я не рекомендую делать это, поля класса, вероятно, то, что вы хотите использовать:

class Example
  @field: false
  init: ->
    @@field = true

При назначении поля класса вы можете использовать префикс @ создать переменную класса. В контексте метода, @@ должен использоваться для ссылки на класс, так как @ представляет экземпляр. Вот краткий обзор того, как @ работает:

class Example
  -- in this scope @ is equal to the class object, Example
  print @

  init: =>
    -- in this score @ is equal to the instance
    print @

    -- so to access the class object, we can use the shortcut @@ which
    -- stands for @__class
    pirnt @@

Кроме того, ваше использование using это неверно. field не является локальной переменной Это поле в мета-таблице экземпляров классов.

Другие вопросы по тегам