2010-10-24 47 views
0
class SomeClass 
end 

some_local_var = 5 

sc = SomeClass.new 

def sc.should_work_closure 
    puts some_local_var # how can I access "some_local_var", # doesn't this work like a closure ? 
end 

sc.should_work_closure() 

9號線:在should_work_closure': undefined local variable or method some_local_var」爲#(NameError) 從t.rb:12紅寶石關閉問題(無法訪問VAR)

回答

0

不,def不工作就像一個閉合。

要在def可用sc你可以把一個常數,使其全球(通常是一個壞主意),或使用define_method與塊(這是閉包)。

但是,由於您不在課堂內,define_method是類(和模塊)的一種方法,因此您不能只使用它。您必須在sc的特徵類上使用class_eval才能進入課程。

例子:

class <<sc; self end.class_eval 
    define_method(:should_work_closure) 
    puts some_local_var 
    end 
end 

這是可行的,但它看起來有點嚇人。在方法定義中訪問周圍範圍的局部變量通常是一個壞主意。

+1

in 1.9.2你可以簡單地去:'sc.define_singleton_method(:should_work_closure){puts some_local_var} 1 – horseyguy 2010-10-24 12:20:31

+0

看起來很可怕,但它肯定不是「通常從周圍訪問局部變量是個好主意範圍在方法定義中「。在函數式編程中這是一個超常見的事情。 – 2013-05-09 01:15:00

+0

@JohnSalvatier你在比較蘋果和橘子。 Ruby沒有嵌套的方法定義,所以當我們談論「來自周邊範圍的局部變量」時,我們在全局範圍內討論局部變量。所以我們基本上是在討論mutable(因爲如果它們不是可變的,它們將被定義爲常量,可以從一個方法中訪問*)全局變量。這些在函數式編程中並不常見。 – sepp2k 2013-05-09 11:50:49