2008-11-01 14 views
21

Więc mam metodę Ruby tak:Składnia na oddanie bloku w jednej linii

def something(variable, &block) 
    .... 
end 

I chcę nazwać tak:

something 'hello' { do_it } 

wyjątkiem tego ISN” działa dla mnie, otrzymuję błąd składni. Jeśli mogę to zrobić, a nie, to działa:

something 'hello' do 
    do_it 
end 

wyjątkiem nie mam niby brakuje piękny wygląd to jest na jednej linii.

Rozumiem, dlaczego tak się dzieje, ponieważ może wyglądać, jakby to mieszanie było przekazywane jako druga zmienna, ale bez przecinka między zmiennymi ... ale zakładam, że musi istnieć sposób radzenia sobie z tego mi brakuje. Jest tu?

Odpowiedz

32

Trzeba brać w nawias swój argument:

something('hello') { do_it } 

który powinien działać.

+0

Tak, to prawda !! Dzięki. Czasami to najbardziej oczywiste rzeczy, za którymi tęsknisz ;-) –

+0

@Cameron Booth: Więc może możesz zaakceptować swoją odpowiedź? :) – Pistos

1

Jeśli chcesz "def coś", aby zaakceptować blok, musisz dostarczyć dane do tego bloku. Na przykład:

#to uppercase string 
def something(my_input) 
yield my_input.upcase 
end 

# => "HELLO WORLD" 
something("hello world") { |i| puts i} 
+0

to niekoniecznie prawda. Nie można niczego uzyskać, przekazać bloku innej metodzie lub zignorować. Nie ma konkretnej potrzeby, by cokolwiek unieść do bloku. Sposób, w jaki została napisana metoda w oryginalnym pytaniu, blok passwd zostanie przekonwertowany na 'Proc' nazwany' blok'. – nertzy

0

Uh, co:

>> def something(arg1 , &block) 
>> yield block 
>> end 
=> nil 
>> def do_it 
>> puts "Doing it!" 
>> end 
=> nil 
>> something('hello') { do_it } 
"Doing it!" 
=> nil 
Powiązane problemy