Как управлять, какую переменную / переменную экземпляра использовать для API Rails

У меня есть 2 способа кода, но я не знаю, какой из них лучше для памяти.

def create
  user = User.find(params[:id])
  address = nil
  user.transaction do
    address = user.address.create!(params[:address_params])
  end
  render json: user, address
end

или же

def create
  @user = User.find(params[:id])
  @user.transaction do
    @address = user.address.create!(params[:address_params])
  end
  render json: @user, @address
end

в этом случае я бы выбрал второй. Но мои коллеги обеспокоены тем, что первый - это оптимальный выбор памяти в случае обратного вызова, например after_action @instance_variable не вернет память до завершения after_action

поэтому я хочу, какой из них лучше и как. Спасибо, пс. извините за мой плохой английский, если моя формулировка / код не ясен, я исправлю это

1 ответ

Практическое правило заключается в том, что нельзя создавать переменные экземпляра и использовать локальные переменные, если только переменная не должна быть повторно использована из другого метода (который в настоящее время, возможно, считается не лучшей практикой).

В любом случае, если ваш код собирается повторно использовать переменную, это переменная экземпляра, потому что локальные переменные будут собираться мусором после возврата метода и недоступны вне области видимости в целом.

Тем не менее, следующий код работает:

class Foo
  def initialize
    @bar = 42
  end
  def calc
    @bar / 2
  end
end
Foo.new.calc

в то время как следующее поднимает:

class Foo
  def initialize
    bar = 42
  end
  def calc
    bar / 2
  end
end
Foo.new.calc

Тем не менее, он очень мало влияет на потребление памяти. Переменные экземпляра никогда не являются узким местом (если, конечно, это не гигабайты), и сборка мусора не обещается сразу же после того, как область действия была оставлена ​​и для локальных переменных.

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