为什么值不在方法范围之外?

时间:2014-08-14 14:20:25

标签: ruby

我在if语句中声明了一个变量,该变量在该范围之外不存在。

def calculate_concurrent_product_quantity(other_job_with_product, job_product)
  other_job_with_product.job_products.map do |prod|
    if prod.product_id == job_product.product_id
      @stuff = prod
      raise
    end
    @stuff #here it equals nil?!
  end
end

如果我在此处引发方法,变量@stuffif语句中保存正确的值。

@stuff
#=> #<JobProduct id: 380, job_id: 90, product_id: 363, quantity: 2, frozen_cache: {}, created_at: "2014-08-14 13:18:02", updated_at: "2014-08-14 13:18:02">

但除此之外的任何东西都不起作用。为什么会这样?我尝试使用select方法而不是像这样做,但是我得到一个错误,说方法是私有的。

1 个答案:

答案 0 :(得分:1)

首先,应该是:

@stuff = other_job_with_product.job_products.find {|prod| prod.product_id == job_product.product_id}

您描述的行为的最可能原因是您处于循环中。 @stuff仅为匹配元素分配值,并且在此之前不会分配。当你提出评论的位置时,你总是在循环的第一次迭代中提高,当@stuff可能仍为零时。只有在找到并分配if时才会提升@stuff内部。