博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭包(Closures)在各种语言中的例子 http://blog.csdn.net/ruby_cn/archive/2004/11/23/192588.aspx
阅读量:2399 次
发布时间:2019-05-10

本文共 2404 字,大约阅读时间需要 8 分钟。

作者:<liubin <AT>huangpuzhuang.com>

2004/11/23

 

    在的一篇关于闭包的文章中(,中文版:),提到了一个例子,主要是用Ruby语言写的,后来网上出现了很多其它语言的版本,本文将各个版本摘录下来,方便大家阅读比较。

1.Ruby

摘自原文

1.
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.newjohn.salary = 200print highPaid.call(john)

 

2.c# 2.0

摘自:

1.

public List
Managers(List
emps) {  return emps.FindAll(delegate(Employee e) {     return e.IsManager;   }}

2.

public List
HighPaid(List
emps) {  int threshold = 150;  return emps.FindAll(delegate(Employee e) {     return e.Salary > threshold;   });}

3.

public Predicate
PaidMore(int amount) {  return delegate(Employee e) {     return e.Salary > amount;   }}

4.

Predicate
highPaid = PaidMore(150);Employee john = new Employee();john.Salary = 200;Console.WriteLine(highPaid(john));

 

3.Python

摘自: 

直接用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]

 

提供了另一种避免使用lambda的方法:
def paidMore(amount):  def paidMoreCheck(e):    return e.salary > amount  return paidMoreCheck

 

4.Java

摘自: 

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

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=192588 

你可能感兴趣的文章
RMAN配置DATAGUARD完整案例(主库基于ASM存储)
查看>>
Oracle分区表
查看>>
关联查询子查询效率简单比照
查看>>
Enterprise Manager之oracle性能与管理
查看>>
linux启动盘制作
查看>>
struts2 标签的使用之一 s:if,siterator使用
查看>>
11gR2批量操作EM性能监控报表集
查看>>
[转帖]广交会使用频率最高的英语
查看>>
职业经理人影响力自检手册(二)
查看>>
企业如何提好自己的内部需求?
查看>>
[分享]ERP实施工程师笔试题目
查看>>
看板管理概述(zt)
查看>>
IT审计中应注意的几个问题(zt)
查看>>
最美的七十个英语单词
查看>>
中国企业需要精益求精 (zt)
查看>>
第四章 计划工作概述
查看>>
物流基础知识(八)
查看>>
关于BPR和ERP的关系思考 (转载)
查看>>
写作必背200句
查看>>
职业经理人影响力自检手册(一)
查看>>