Ruby中,所谓带块(block)的方法是指对控制结构的抽象,最初设计是用于对循环进行抽象,所以又称迭代器。
语法:method_name do...end 或 method_name {}
1
#块调用
2
def foo
3
print yield(5)
4
end
5
6
foo {|a|
7
if a > 0
8
"positive"
9
elsif a < 0
10
"negative"
11
else
12
"zero"
13
end
14
}
15
16
foo()
17
18
#使用了proc(过程对象)的块调用
19
quux = proc {|a|
20
if a > 0
21
"positive"
22
elsif a < 0
23
"negative"
24
else
25
"zero"
26
end
27
}
28
29
def foo(p)
30
print p.call(5)
31
end
32
33
foo(quux)
#块调用2
def foo3
print yield(5)4
end5

6
foo {|a|7
if a > 08
"positive"9
elsif a < 010
"negative"11
else12
"zero"13
end14
}15

16
foo()17

18
#使用了proc(过程对象)的块调用19
quux = proc {|a|20
if a > 021
"positive"22
elsif a < 023
"negative"24
else25
"zero"26
end27
}28

29
def foo(p)30
print p.call(5)31
end32

33
foo(quux) 1
//传统委托
2
public delegate string fooDelegate(int a);
3
public string foo(int a)
4
{
5
if(a > 0)
6
return "positive";
7
else if(a < 0)
8
return "negative";
9
return "zero";
10
}
11
fooDelegate myD1 = new fooDelegate(foo);
12
Console.WriteLine(myD1(5));
13
14
//匿名委托 C# 2.0
15
public delegate string fooDelegate(int a);
16
fooDelegate myD1 = delegate(int a)
17
{
18
if(a > 0)
19
return "positive";
20
else if(a < 0)
21
return "negative";
22
return "zero";
23
}
24
Console.WriteLine(myD1(5));
//传统委托2
public delegate string fooDelegate(int a);3
public string foo(int a)4
{5
if(a > 0)6
return "positive";7
else if(a < 0)8
return "negative";9
return "zero";10
}11
fooDelegate myD1 = new fooDelegate(foo);12
Console.WriteLine(myD1(5));13

14
//匿名委托 C# 2.015
public delegate string fooDelegate(int a);16
fooDelegate myD1 = delegate(int a)17
{18
if(a > 0)19
return "positive";20
else if(a < 0)21
return "negative";22
return "zero";23
}24
Console.WriteLine(myD1(5));// Action/Func委托 + lambda表达式 C# 3.0 Action<Func<int, string>> foo = (func)=>{ Console.WriteLine(func(5)); }; Action qoo = () => { foo((a) => { if(a > 0) return "positive"; else if(a < 0) return "negative"; return "zero"; }); }; qoo(); Func<int, string> quux = (a) =>{ if(a > 0) return "positive"; else if(a < 0) return "negative"; return "zero"; }; Action<Func<int, string>> foo = (func)=>{ Console.WriteLine(func(5)); }; foo(quux);

