2012-10-07 4 views
17

I gespeichert werden soll ein „Codeblock“ in einer Variablen speichern, wiederverwendet werden, so etwas wie:Wie Ruby-Code-Blöcke

block = do 
|test| puts test 
end 

3.upto(8) block 

Kann mir jemand zeigen, was bin ich so offensichtlich falsch? (Oder wenn es nur unmöglich)

Antwort

24

Es gibt viele Möglichkeiten, dies in Ruby zu tun, von denen eines ein Proc verwenden:

foo=Proc.new do |test| 
    puts test 
end 

3.upto(8) { foo.call("hello world") } 

Lesen Sie mehr über Procs:

aktualisieren, könnte das obige Verfahren umgeschrieben werden wie folgt:

# using lower-case **proc** syntax, all on one line 
foo = proc { |test| puts test } 
3.upto(8) { foo.call("hello world") } 

# using lambda, just switch the method name from proc to lambda 
bar = lambda { |test| puts test } 
3.upto(8) { bar.call("hello world") } 

Sie sind im Grunde sehr ähnliche Methoden, mit feinen Unterschieden.

Und schließlich gibt es wahrscheinlich elegantere Möglichkeiten, um das zu tun, was ich skizziert habe, sei gut, von jemandem mit einem besseren Weg zu hören. Hoffe das hilft.

+2

Vielen Dank. Für den Link noch mehr. Kannst du so freundlich sein, auch Lambdas zu erwähnen? Aus historischen Gründen. –

+0

@ Shingetsu, fügte ich hinzu und aktualisiere mit Lambda, sowie eine etwas vereinfachte Version des Proc-Ansatzes zu – stephenmurdoch

+3

@ Shingetsu: Lambdas sind nicht historisch. Sie sollten sie fast immer anstelle von Procs verwenden. Sie sind viel besser ausgestattet und sind der Standard. – Linuxios