作者:<liubin <AT>huangpuzhuang.com>
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);
5万+

被折叠的 条评论
为什么被折叠?



