首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Scala实现一个简单的Python的上下文管理器

上下文管理器是对try/finally模式的简化,保证一段代码运行完后执行某项操作,即使那段代码被中止了,也会执行指定的操作。在这篇文章将展现函数式编程的威力,用Scala写一个简单的上下文管理器。

简单介绍下Python的with,它是属于上下文管理器协议,使用__enter__和__exit__方法实现协议,在with语句运行之前会调用__enter__方法,结束之后调用__exit__方法。最常见的例子就是关闭文件对象,这次我们也要用Scala实现下面的语法。

在开始写之前,先了解下柯里化(Currying)的概念。柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数。先看看一个正常的oldSum函数:

curriedSum是柯里化函数,当在调用curriedSum时,实际上是连着做了两次的函数调用,可以理解为是一个嵌套函数:

虽然实现原理并不一致,但是可以这么理解柯里化的实现过程,并且也可以通过占位符(一个神奇的符号)去缓存第二个函数的使用。

当了解柯里化后,回忆一下,前文提到了Scala里的函数是一等对象,函数本身是可以当作参数传给函数的:

神奇的_符号又来了,_ + 1可以理解为(如果不是老手,_+1并没有下面的容易理解):

plus:Int => Int,这里的含义是传入一个入参为Int类型的值,返回值是Int类型值函数。除了圆括号,函数的参数传入也能使用{},例如:

Scala在函数的入参只有一个函数时,允许你使用{}调用函数,不过仅限你的函数只接受一个入参。有了这个铺垫,下面的withFile就容易理解了。withFile是一个柯里化函数,第二个参数列表需要传入一个输入类型为BufferedSource,无返回值的函数,我们借用了{}去模仿Scala的控制结构。一个简单的上下文管理器就实现了。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G1OVTX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券