作者:<liubin <AT>huangpuzhuang.com>
http://www.ruby-cn.org/
2004/11/23
在Martin Fowler的一篇关于闭包的文章中(http://martinfowler.com/bliki/Closures.html,中文版:http://www.ruby-cn.org/articles/closures.html),提到了一个例子,主要是用Ruby语言写的,后来网上出现了很多其它语言的版本,本文将各个版本摘录下来,方便大家阅读比较。
1.Ruby
摘自原文http://martinfowler.com/bliki/Closures.html
def managers(emps) return emps.select {|e| e.isManager} end
2.
def highPaid(emps) threshold = 150 return emps.select {|e| e.salary > threshold} end
3.
def paidMore(amount) return Proc.new {|e| e.salary > amount} end
4.
highPaid = paidMore(150) john = Employee.new john.salary = 200 print highPaid.call(john)
2.c# 2.0
摘自:http://joe.truemesh.com/blog//000390.html
1.
public List<Employee> Managers(List<Employee> emps) { return emps.FindAll(delegate(Employee e) { return e.IsManager; } }
2.
public List<Employee> HighPaid(List<Employee> emps) { int threshold = 150; return emps.FindAll(delegate(Employee e) { return e.Salary > threshold; }); }
3.
public Predicate<Employee> PaidMore(int amount) { return delegate(Employee e) { return e.Salary > amount; } }
4.
Predicate<Employee> highPaid = PaidMore(150); Employee john = new Employee(); john.Salary = 200; Console.WriteLine(highPaid(john));
3.Python
摘自:http://ivan.truemesh.com/archives/000392.html
直接用lambda函数
1.
def managers(emps):
return filter(lambda e: e.isManager, emps)
2.
def highPaid(emps):
threshold = 150
return filter(lambda e: e.salary > threshold, emps)
3.
def paidMore(amount):
return lambda e: e.salary > amount
4.
highPaid = paidMore(150)
john = Employee()
john.salary = 200
print highPaid(john)
另一种方式,用列表包含(list comprehensions)
1.
def managers(emps):
return [e for e in emps if e.isManager]
2.
def highPaid(emps):
threshold = 150
return [e for e in emps if e.salary > threshold]
Chris Reedy 提供了另一种避免使用lambda的方法:
def paidMore(amount): def paidMoreCheck(e): return e.salary > amount return paidMoreCheck
4.Java
摘自: http://joe.truemesh.com/blog//000390.html
jdk 1.5支持
private class FindHighPaidEmployees extends Algorithms { Constraint highPaidEmployee; public FindHighPaidEmployess(Constraint constraint) { this.highPaidEmployee = constraint; } public Object call(Object o) { List emps = (List)o; return findAll(emps, highPaidEmployee); } } private class PaidMore implements Constraint { private int salary; public PaidMore(int salary) { this.salary = salary; } public boolean test(Object o) { return ((Integer)o).intValue() > salary; } }
Closure highPaidFinder = new FindHighPaidEmployees(new PaidMore(150)); List highPaidEmployees = highPaidFinder.call(myEmployees);