【问题标题】:How to manage which variable/instance variable to use for API Rails如何管理用于 API Rails 的变量/实例变量
【发布时间】:2019-02-27 02:58:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby variables memory-management code-readability


    【解决方案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
    

    不过,它对内存消耗的影响非常小。实例变量从来都不是瓶颈(当然,除非它是千兆字节),并且在为局部变量留出作用域后,也不会立即进行垃圾收集。

    【讨论】:

    • 所以在小范围内,即使变量混合起来实际上对内存几乎没有影响,所以据我了解``` def create @user = User.find(params[:id]) @user。事务做 @address = user.address.create!(params[:address_params]) end render json: @user, @address end ```
    猜你喜欢
    • 2012-12-20
    • 2011-12-12
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多