ruby、Python 以及 Swift 语言关于 “Finally” 实现的趣谈

news2025/1/4 18:30:59

在这里插入图片描述

0. 概览

结构化代码语义是任何语言入门之必备基本功,想写出“意大利面条”似的美味代码么?直接干就对了!

虽然上面有些“话糙理不糙”,但不可否认的是现今几乎所有高级语言都对代码结构化语义提供了良好的支持。入门码农们的第一课都是先从顺序执行、跳转、条件走偏开始学起。

在顺序执行的结构化代码中,如果之前申请了资源,怎么确保随后无论发生什么事它们都可以被正确释放呢?

在本篇博文中,您将了解到如下内容

  • 0. 概览
  • 1. 什么是 “Finally” ?
  • 2. 从 ruby 谈起
  • 3. Python 中的实现
  • 4. “格格不入”的 Swift
  • 5. 轻量级 Finally 语法糖
  • 总结

有点“兴奋”了吗?那还等什么?

在这里插入图片描述

Let’s go!!!😉


1. 什么是 “Finally” ?

在这里插入图片描述

Finally 这个词很形象!它像一个会发出声音的感叹词:谢天谢地,这一切终于结束了!你终于来了!

在这里插入图片描述

一段代码在执行中可能出现各种意外情况:参数错误、文件损坏、有异常抛出、处理器罢工、新买的 M3 Max 纯黑丝 MBP 爱机变心了…

在这里插入图片描述

如果我们在代码中创建了一些资源,怎么确保在上面这些情况发生时它们还可以被正确释放掉呢?

#!/usr/bin/ruby

file = File.open("lazy.rb")
r = 1..63
for a in r do
    // 可能的抛出异常点:内存不足!
    for b in r do
        // 可能的抛出异常点:处理器罢工!
        for c in r do
            // 可能的抛出异常点:爱机抑郁!
            for d in r do
                // 可能的抛出异常点:...
                if a + b + c + d == 63
                    rlt = a*b + b*c + c*d
                    if rlt >= max 
                        max = rlt
                        file.puts(max)
                    end
                end
            end
        end
    end
end

print("max is #{max}\n")

比如在上面的 ruby 代码里,我们崎岖前行中的代码可能会遇到各种“艰难险阻”,那么一旦“祸从天降”如何保证开头的 file 对象占据的资源被释放呢?

上帝说:要有 Finally ! 于是乎,Finally 机制应运而生了!

Finally 就是一位“超级保姆”、一位技术高超的 Cleaner!不管之前是多么的一塌糊涂,只要一经它手收拾就会变得的“窗明几净”,任何之前残留的痕迹都将一去不复返,正所谓:“两岸猿声啼不住,轻舟已过万重山!呜呼哉!”

在这里插入图片描述

Finally 是结构化开发中一道靓丽的“屏障”,不管发生神马,Finally 块中的代码一定会被执行!(你们确定一定以及肯定?)

2. 从 ruby 谈起

首先,我们来看看 ruby 对 Finally 的支持。(不知为何看到 ruby 总有种要发财的赶脚…金银财宝快过来…)

在这里插入图片描述

ruby 中使用 ensure 语句块来支持 Finally 的语义:

begin
file = File.open("lazy.rb")
# 其它可能会抛出异常的其它操作...
ensure
file.close
puts("文件已被释放!")
end

看到了吗?我就是不缩进!!!Python 你咬我啊!😃

当然,我们还可以加入 rescue 子句来处理异常:

begin
file = File.open("lazy.rb")
# 其它可能会抛出异常的其它操作...
rescue
puts("ERR: #{$!}")
ensure
file.close
puts("文件已被释放!")
end

3. Python 中的实现

在这里插入图片描述

不知 ruby 和 Python 这哥俩到底是谁“抄袭”的谁,Python 对 Finally 的实现几乎与 ruby 毫无二致:

f = None 
try:
    f = open("lazy.txt")
    # 可能有其它“惊喜”等待着我们,但我们不怕!:)
except IOError:
    print("无法打开 lazy.txt 文件")
except KeyboardInterrupt:
    print("用户终止了输入,可能是因为着急去交水费!")
finally:
    if f:
        f.close()
    print("成功关闭文件!")

从如上代码中可以发现,除了将 rescue 变为 except、把 ensure 改为 finally 一切几乎都没啥区别。

当然,还有层层缩进仿佛在诉说着什么…

在这里插入图片描述

4. “格格不入”的 Swift

在这里插入图片描述

如果说 ruby 和 Python 有点像兄弟俩,那么 Swift 更像一只“莫名其妙”的燕子(这句话更莫名其妙)。

有点“出乎意料”的是,在 Swift 语言中我们使用 defer 关键字来保证一段语句块中必须被 Finally 清理掉的内容:

func read() -> String {
    
    let file = File.open(...)
    
    defer {
        file.close()
    }
    
    do {
        return try file.readlines.join("\n")
    } catch {
        print("ERR: \(error)")
    }
}

如上代码所示,不管最后代码流以何种方式离开 read() 方法,defer 语句块中的内容都会被执行!

5. 轻量级 Finally 语法糖

其实对于简单的 Finally 实现,ruby 和 Python 都支持更便捷的语法。

比如在 ruby 中我们可以在文件打开的附庸闭包中处理文件,当闭包结束时文件对象自然“灰飞烟灭”:

File.open("lazy.rb") {|file| file.readlines}

而在 Python 中也有对应的 with 语句欲“乘风而去”:

with open("lazy.txt") as file:
    for line in file:
        print(line, end='')

在上面两段代码片段中,被打开的 file 永远无法逃出其最终的宿命,一切尽在不言中!

在这里插入图片描述

那么,看到这里小伙伴们对哪种语言中 Finally 的实现更情有独钟呢?

在这里插入图片描述


喜欢这种天马行空无厘头写作风格的小伙伴们,请到如下链接观赏更“刺激”的文章:

  • iOS系统逆向工程之神探侯佩智破量子矩阵

请做好准备不要惊掉下巴哦!


总结

在本篇博文中,我们讨论了 ruby、Python 和 Swift 语言中对 Finally 机制的不同实现,并用诸多代码片段来演示它们实际的使用,小伙伴们值得拥有!

感谢观赏,再会!😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1173937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

循环队列练习

循环队列练习 相关内容&#xff1a; 1.队列顺序存储的不足 2.循环队列&#xff08;队列头尾相接的顺序存储结构&#xff09; //队列的初始化、入队、出队、取对头、计算队长度 #include<stdio.h> #define MAXSIZE 10 typedef int Status; #define OK 1 #define ERROR 0…

虚幻C+++基础 day2

角色移动与视角控制 Character类与相关API 创建Character子类MainPlayer.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "GameFramework/Character.h" #include &q…

centos7.0+最快速安装docker的方法

先安装yum工具&#xff0c;然后添加阿里云的docker仓库&#xff0c;然后yum安装&#xff0c;然后启动 安装yum-config yum install yum-utils -y yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce do…

一款简单而强大的文档翻译网站

一款文字/文件翻译的网站,支持多个领域的翻译&#xff0c;支持常见的语言翻译(韩/日/法/英/俄/德…),最大百分比的保持原文排版(及个别除外基本100%还原)。 新用户注册就有100页的免费额度&#xff0c;每月系统还会随机赠送翻译额度&#xff0c;说实话这比好多的企业要好的多了…

为什么没有面试机会?是因为你没有掌握这套完整的性能测试流程,

一、准备工作 在什么阶段开展性能测试工作&#xff1f;一般情况下&#xff0c;是在被测系统已完成功能测试、系统趋于稳定的情况下&#xff0c;才会进行性能测试。 1. 组建测试团队 根据被测系统的实际情况&#xff0c;组建一个性能测试团队&#xff0c;团队成员包括&#xff…

CUMT-----Java课后第五章编程作业

文章目录 一、题11.1 问题描述1.2 代码块1.3 运行截图 二、题22.1 问题描述2.2 代码块2.3 运行截图 一、题1 1.1 问题描述 (1)使用继承编写人类、教师、学生类的实体类。(2)编写测试类&#xff0c;实例化教师和学生类对象并显示。 1.2 代码块 public class Human {private S…

镭神智能C16的ROS驱动的安装方法

原文链接 前言 激光雷达赶上了自动驾驶了浪潮&#xff0c;国产激光雷达也越来越多。 最近团队要购买激光雷达&#xff0c;正好拿镭神智能的产品测试一下&#xff0c;安装驱动是首先要做的&#xff0c;因此在这里记录一下。 产品说明&#xff1a;http://www.leishen-lidar.com…

multiple kernel learning(MKL)多核学习

历史上之所以会出现多核学习&#xff08;MKL&#xff09;这个词&#xff0c;是因为在深度学习流行起来以前&#xff0c;kernel是处理非线性的默认方法&#xff0c;那个年代优化一个非线性函数不容易&#xff0c;每加一层复杂性可能就需要多设计一个优化算法&#xff0c;MKL就是…

使用 ChatGPT 提升 LeetCode 刷题效率

文章目录 1 背景2 操作步骤 1 背景 在做 LeetCode 的 SQL 题库时, 想在本地调试, 需要在本地的数据库上创建表以及准备测试数据, 大家都是有经验的开发人员, 简单粗暴的办法就不讲了 可以借助 ChatGPT 的能力, 生产数据库的表以及测试数据的 sql, 提升刷题效率 2 操作步骤 将…

K8S知识点(四)

&#xff08;1&#xff09;环境搭建-集群安装 查看所需镜像 定义下载镜像 循环下载镜像&#xff1a; 下载完成之后&#xff1a;查看一下镜像&#xff0c;名字也已经改成了k8s的名字 集群初始化只在master节点上运行&#xff0c; 出现sucessfully表示成功&#xff0c;提示要运…

5.3 连接和分离线程

方法 pthread_join(thread, status) pthread_detach(thread) pthread_attr_setdetachstate(attr, detachstate) pthread_attr_getdetachstate(attr) 连接 连接&#xff08;joining&#xff09;是一种线程之间完成同步的方法&#xff0c;举例如下。 pthread_join()方法会阻…

Ultra:知识图谱推理的基础模型

一、说明 训练单个通用模型来解决任意数据集始终是 ML 研究人员的梦想&#xff0c;尤其是在基础模型时代。虽然这些梦想已经在图像或自然语言等感知领域实现了&#xff0c;但它们是否可以在推理领域&#xff08;如图形&#xff09;中再现仍然是一个开放的挑战。 图片由作者根据…

PDUR IPDUM

步骤1&#xff1a;思考问题 PDUR&#xff08;PDU Router&#xff09;&#xff1a;PDUR是负责消息的路由和转发。PDUR模块接收来自上层的消息&#xff0c;并根据预定义的路由规则将消息转发给相应的下层模块&#xff0c;或者将从下层接收到的消息转发给相应的上层模块。 PDUR的主…

SOEM源码解析——ecx_init_context(初始化句柄)

0 工具准备 1.SOEM-master-1.4.0源码1 ecx_init_context函数总览 /*** brief 初始化句柄* param context 句柄*/ void ecx_init_context(ecx_contextt *context) {int lp;*(context->slavecount) 0;/* clean ec_slave array *//* 清空从站信息数组 */memset(context->…

python-在系统托盘显示CPU使用率和内存使用率

一、添加轮子 1.添加托盘区图标库 infi.systray from infi.systray import SysTrayIcon 2.添加图像处理库 Pillow from PIL import Image, ImageDraw, ImageFont 3.添加 psutil 来获取CPU、内存信息 import psutil 二、完整代码 from infi.systray import SysTrayIcon …

简单-【1 绪论】

关键字&#xff1a; 数据类型、数据结构定义、递归关键、线性结构、非线性结构、算法特性、算法目标、时间复杂度排序

【异常错误】Multiple top-level packages discovered in a flat-layout: [

今天在配置环境时&#xff0c;在运行代码&#xff1a; pip install -e . 出现了以下错误&#xff1a; 解决方案 在setup.py中显示加入一行 py_modules[]&#xff0c;如&#xff1a; setup(namexxxx,versionx.x,py_modules[], ) 再次运行pip指令安装即可解决。 error: Mul…

由于找不到msvcr110.dll无法继续执行此代码怎么解决?5个解决方法分享

MSVCP110.dll是Microsoft Visual C 2012运行时库的一部分&#xff0c;它包含了许多用于支持C应用程序运行的函数。当您在运行某些程序时&#xff0c;可能会遇到“msvcp110.dll丢失”的错误提示。为了解决这个问题&#xff0c;您可以尝试以下5种方法&#xff1a; 方法1. 重新安装…

思维模型 霍布森选择效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。这是一个设计好的陷阱&#xff0c;也许你认为你有选择&#xff0c;然后冥冥之中你的选择却很少&#xff0c;尽在所谓的“命运”掌握之中。 1 霍布森选择效应的应用 1.1 iphone的营销策略之…

为什么说IT企业知识库是知识共享的驱动力?

在快速发展和不断变化的IT行业中&#xff0c;知识的积累和共享是保持竞争力的关键。一个完善的知识库可以帮助企业有效管理和传承内部知识&#xff0c;提高团队的工作效率和协作能力。随着企业规模的扩大和员工的流动性增加&#xff0c;一个完善的知识库可以确保知识的传承和持…