首页 > 解决方案 > 如何管理用于 API Rails 的变量/实例变量

问题描述

我有两种编码方式,但我不知道哪一种更适合记忆。

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 完成之前不会返回内存

所以我想哪个更好以及如何。谢谢ps。如果我的措辞/代码不清楚,对不起我的英语不好,我会修复它

标签: ruby-on-railsrubyvariablesmemory-managementcode-readability

解决方案


经验法则是不创建实例变量并使用局部变量,除非要在另一种方法中重用该变量(现在可以说这不是最佳实践。)

无论如何,如果您的代码要重用该变量,它就是实例变量,因为局部变量将在方法返回后被垃圾回收,并且通常无法从范围之外访问

也就是说,以下代码有效:

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

但是,它对内存消耗的影响很小,如果没有的话。实例变量永远不是瓶颈(当然,除非它是千兆字节),并且在为局部变量留出作用域之后,也不会承诺立即进行垃圾收集。


推荐阅读