Blok jest w pewnym sensie tylko funkcją anymonalną. Nigdy nie programowałem java, ale oto kilka przykładów kodu dla innych języków, aby pokazać, że bloki są podobne do przekazywania anonimowych funkcji.
Ruby:
def add_5
puts yield + 5
end
add_5 { 20 }
# => 25
Javascript:
var add_5 = function(callback){
return callback.call() + 5;
}
add_5(function(){ return 20 });
// returns 25
Lua:
local function add_5(callback)
print(callback() + 5);
end
add_5(function()
return 20;
end)
-- returns 25
Innymi słowy, jeśli Java obsługuje anonimowe funkcje tak, masz sobie blok! Ponieważ są funkcjami, mogą przyjmować argumenty, podobnie jak bloki. Oto kolejny przykład Lua:
local function add_something(callback)
callback(5/2);
end
add_something(function(a)
print(a + 5);
end)
-- 7.5
Niepoprawnie. Groovy obsługuje parametry nazwane do zablokowania. Zobacz: http://groovy.codehaus.org/JN2515-Closures#JN2515-Closures-ClosureParameters – jiggy
Oczywiście Groovy obsługuje nazwane parametry do bloków. :-) Moim komentarzem jest, że w Groovy, jeśli twój blok przyjmuje jeden parametr, nazywanie go jest opcjonalne --- podczas gdy w Ruby jest obowiązkowe. –
Przepraszam, źle odczytałem :) – jiggy