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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

// 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);