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。這應該在實踐的背景下進行評估,而不是主要的:對象。
我會做什麼錯?
是的,也可以,但我不完全明白爲什麼我最初的方式不起作用。在實踐的背景下。自我指的是instance_eval中的實踐,所以它就像是說自我。在哪裏,這是實踐,但它認爲它是主體。這是令人困惑的部分。 – Donato 2015-02-06 01:23:19
不,塊是詞法範圍的,所以'self'就是它在塊的定義位置處的任何東西。您可以使用'instance_eval'來更改塊中的'self',但是您並未評估第1行的塊,而是評估您傳遞給'instance_eval'的塊。 – 2015-02-06 01:49:24
澄清:'instance_eval'在傳遞給'instance_eval'的塊內改變'self'。它不會在程序的其他部分中的某個其他塊中更改「self」。那將意味着混亂。 – 2015-02-06 11:32:46