2015-02-06 48 views
1

評估進程內對象下面我在控制檯創建一個進程內對象:被拋出在不同的語境

2.1.2 :050 > p = Proc.new { where(id: 1)} 

沒有錯誤,因爲PROC對象未評價。它只是簡單地存儲代碼塊。

現在我想在練習ActiveRecord對象的上下文中評估該塊代碼。我嘗試以下操作:

2.1.2 :051 > Practice.instance_eval { p.call } 
NoMethodError: undefined method `where' for main:Object 

爲什麼我得到未定義的方法,其中main:Object。這應該在實踐的背景下進行評估,而不是主要的:對象。

我會做什麼錯?

回答

0

所以它在這方面執行的,必須通過PROC作爲參數。

Practice.instance_eval(&p) 
+0

是的,也可以,但我不完全明白爲什麼我最初的方式不起作用。在實踐的背景下。自我指的是instance_eval中的實踐,所以它就像是說自我。在哪裏,這是實踐,但它認爲它是主體。這是令人困惑的部分。 – Donato 2015-02-06 01:23:19

+2

不,塊是詞法範圍的,所以'self'就是它在塊的定義位置處的任何東西。您可以使用'instance_eval'來更改塊中的'self',但是您並未評估第1行的塊,而是評估您傳遞給'instance_eval'的塊。 – 2015-02-06 01:49:24

+2

澄清:'instance_eval'在傳遞給'instance_eval'的塊內改變'self'。它不會在程序的其他部分中的某個其他塊中更改「self」。那將意味着混亂。 – 2015-02-06 11:32:46

0

我能得到它的工作的唯一方法是通過傳遞參數給PROC:

@collection = model.send query_conditions.collect {|proc| proc.call model } 

Proc.new { |model| model.where("#{key} >= #{value[condition]} AND #{key} <= #{value[condition]}") }