隐式转换:比动态类型更强大?

  本文内容主要来自[url=http://www.codecommit.com/blog/ruby/implicit-conversions-more-powerful-than-dynamic-typing]Implicit Conversions: More Powerful than Dynamic Typing?[/url],我只对其中一部分进行了翻译。
  隐式转换是[url=Haskell type classes]Scala[/url]中实现的一种类似于Haskell type classes的类型系统,它使得Scala这种静态类型的语言具有某些“动态”的特性。下面用具体例子来说明。

[color=red]案例1[/color]:[color=blue]给String添加一个reduce方法,其返回值为字符串中大写字母组成的新字符串。[/color]
在Scala中,最终效果如下:
//Scala
val acronym = "Microsoft Certified Systems Engineer".reduce
println(acronym) // MCSE

  由于String是Java语言内置的类型,现在遇到的问题是:在静态语言中,我们不能在运行时往已经存在的类中动态添加方法。
  在Scala中,我们可以定义一个新的类型,使它具有所需要的方法,然后再顶一个一个从已有类型到新类型的隐式转换。然后Scala编译器将会在幕后实施其魔法。代码如下:
class MyStr(str:String) {
def reduce = str.foldLeft(""){ (s,c) =>
if(c.isUpperCase) s+c else s
}
}

implicit def str2MyStr(str:String) = new MyStr(str)


作为对照,我们看看在Ruby中的实现:
class String
def reduce
arr = unpack('c*').select { |c| (65..90).include? c }
arr.pack 'c*'
end
end

puts 'HyperText Transfer Protocol'.reduce # HTTP



[color=red]案例2[/color]:[color=blue]一个稍微复杂一点的问题:重载整数类型的[/color][color=red]<[/color][color=blue]操作符,使得它能与String比较,并且但String的长度小于该整数时返回true,否则返回false[/color]
  在Scala中,同样可以通过隐式转换机制来解决该问题。这一次我们使用比上面更简洁的形式:
//Scala,that's all
implicit def lessThanOverload(i: Int) = new {
def <(str: String) = str.length < i
}

  下面我们看看Ruby中如何解决这个问题,一个很自然的想法是玩Fixnum中添加所需的方法:
class Fixnum
def <(str)
str.size < self
end
end

  很不幸的是,这个看起来很对的方法是行不通的。每次调用整数的<操作符时都会进入一个死循环并很快导致堆栈溢出。
  我们可以将方法改写成如下以避免这个问题:
class Fixnum
def <(str)
self >= str.size
end
end

  这次不用担心堆栈溢出了,但新的问题出现了:
[quote]irb(main):006:0> 123 < 'test'
=> true
irb(main):007:0> 123 < 123
=> true[/quote]
  这个问题的最终Ruby解法是这样的:
class Fixnum
alias_method :__old_less_than__, '<'.to_sym
def <(target)
if target.kind_of? String
__old_less_than__ target.size
else
__old_less_than__ target
end
end
end

  囧,相比Scala,Ruby的解决方法显得即冗长且丑陋。
C# 动态类型(Dynamic Type)使用详解:从入门到精通 C#动态类型使用指南:从基础到高级实践 C# 4.0引入的动态类型(dynamic)为静态类型语言带来了灵活性,特别适合处理动态数据结构、简化反射操作和COM互操作等场景。本指南全面解析动态类型的使用方法: 核心概念 dynamic关键字将类型检查推迟到运行时 与object类型不同,dynamic无需显式转换 适用于处理JSON/XML、COM互操作等场景 基础用法 动态变量可存储任意类型值 支持动态调用方法和属性 可作方法参数和返回值 阅读详情

相关推荐

Go接口本质:隐式契约、最小原则与 nil 陷阱解析

Go接口并非传统面向对象中的抽象类,而是一种编译期静态检查的隐式能力契约,其核心是‘能做什么’而非‘是什么’。它基于鸭子类型思想,通过方法签名完全匹配实现自动满足,支撑了io.Reader等最小接口的广泛复用。这种设计带来高度解耦与组合自由,但也引入nil判断陷阱、类型断言安全性和接口演化约束等工程挑战。理解接口的动态类型/值二元性、消费端定义原则及与泛型的协同边界,是构建可测、可维护Go服务的关键技术基础。

weixin_30564901的博客 739

Ruby中,实例方法可以隐式使用类变量,但是必须显式使用类方法

class C @@Const1=1 Const2=2 @@var3=3 def self.m p @@Const1,Const2,@@var3; end def m2 p @@Const1,Const2,@@var3; C::m #ok #m #error:undefined local variable or method `m'

lslxdx的专栏 1274

16、Scala 隐式转换与类型类模式深度解析

本文深入解析了 Scala 中的隐式转换与类型类模式,探讨了它们在解决表达式问题、扩展现有类功能以及实现即席多态方面的应用。文章详细介绍了隐式转换的工作原理、技术问题、Scala 内置的隐式转换以及相关的最佳实践。通过示例代码,展示了如何使用隐式类实现 toJSON 方法、处理异构类型列表以及实现 Scala 与 Java 类型的互操作性。此外,还总结了隐式转换的优缺点,并提供了在实际开发中使用隐式转换的决策流程图和 mermaid 示例。

vvv99的博客 131

Java基础——隐式转换vs强制转换

在定义变量时,有许多要注意的问题,一不小心就会出现损失精度或者不兼容类型等问题。 例如:     1.定义长整型数据时,必须加后缀l或L               long l =123456789012345L     2.定义单精度类型时(7-8位有效数字),必须加后缀 f 或 F               float f = 12.5F           3. bo

贵宝的博客 2万+

C++中动态类型转换与类型识别的正确使用

本文探讨了C++中动态类型转换(dynamic_cast)与类型识别(RTTI)的使用,包括其与static_cast、reinterpret_cast、const_cast和typeid操作符的区别和联系。通过代码示例和详细解释,深入解析了如何在保持类型安全的同时实现基类和派生类指针间的转换,以及如何利用RTTI机制获取对象类型信息。

weixin_35751412的博客 460

eNSP搭建基础网络

1、除5的环回地址固定以外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2、R1-R4每个路由器存在两个环回接口,用于模拟连接pc网段﹔地址也在192.168.1.0/24这个网络范围内 3、R1-R4上不能直接编写到达5.5.5.0/24的静态路由,但依然可以访问 4、全网可达,尽量减少每台路由器,路由表条目数量,避免环路出现5R4与R5间,正常100oA链路通信,故障时自动改为100M 全网使用192.168.1.0/24网段进行划分,尽量减少路由条目Pc端IP使用pHcP技

在月光下棕榈树的叶子在瑟瑟抖动 8471

ruby不同数据类型之间的相互转换

ruby的整数、浮点数、字符串的类均提供了to_i,to_f,to_s三个方法 浮点数转换成整数,只保留整数部分 irb(main):138:0&gt; 3.5.8.to_i =&gt; 3 整数转换成浮点数,会添加小数点和0 irb(main):147:0&gt; 3.to_f =&gt; 3.0 整数转换成字符串,会加上双引号 irb(main):151:0&gt; 3.to...

我的祖传代码 3612

WinCC动态选择报警记录案例

本例中需要确认查询的时间段以及查询的关键字,然后通过一个按钮来执行报警数据查询脚本,并把查询出的结果加载到当前报警控件中。<本例中数据查询脚本的思路是根据选项组所选定的参数加载相应的归档变量到在线趋势控件,根据设定的查询时间范围设定控件时间轴的开始时间及结束时间。本文以 WinCC V8.0为例,介绍如何动态的查询WinCC报警记录,包括关键字查询/时间&关键字查询,如图1所示。<在WinCC变量管理中创建不同的变量组,并在变量组下创建相应的变量,如图2 所示(下图并非实际变量值)。

weixin_45072604的博客 2715

如何在老款 Mac 上安装新版 macOS:OpenCore Legacy Patcher 完整指南

2007 至 2017 年款的 Intel Mac 可借助 OpenCore Legacy Patcher 安装 macOS 11 至 macOS 15,并恢复原生 OTA 更新能力。 ## 你的设备能不能用 打开"关于本机"→"系统报告",查看"型号标识符"一项,再对照下方范围。若你的设备不在范围内,说明这条 Intel Mac 安装新版系统的路径对本工具不可用。 | 设备系列 | 支持年

gitblog_00007的博客 881

【GAN】pytorch-CycleGAN-and-pix2pix开源项目训练自定义数据集

Github:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 一、概念简介 图像转换:将一张图片转换为不同风格的图片,如将一张灰度图变成彩色图,素描图换成实物图。 pix2pix:需要成对的数据集,两个不同域的图像一一对应。 CycleGAN:不需要成对的数据集,只用两个不同域(domain)的图像集合X和Y,两个集合中的图像不是一一对应的。 二、训练pix2pix模型 2.1 combine_A_and_B datasets/combin

See_Star的博客 4756

Kettle入门指南:从安装到数据转换实战

本文提供Kettle(Pentaho Data Integration)的完整入门指南,涵盖从Java环境安装、软件配置到核心概念(转换与作业)的详细解析。通过实战案例,手把手教你如何将文本文件数据导出到Excel,并连接MySQL数据库进行数据导入,帮助你快速掌握这一强大ETL工具的基本使用,实现高效数据搬运与转换。

weixin_29266647的博客 451

JavaScript 中的弱类型,动态类型

JavaScript 是一门弱类型(weakly typed),动态类型(dynamically typed)的编程语言,其中它弱类型的特性让人又爱又恨,既带来了一些简洁的语法,在一定程度上提升了开发者的编码速度,也带来了一些坑,增加了项目维护的难度。本文介绍 JavaScript 中弱类型的一些体现方面,看看我们能如何更好的利用它。 编程语言的类型 编程语言可以被分为弱类型或强类型,静态类型或...

wsc2111的博客 2484

告别电机啸叫!手把手教你配置TMC5160的StealthChop2静音模式(附参数自整定避坑指南)

本文详细介绍了如何通过配置TMC5160的StealthChop2模式彻底消除3D打印机电机噪音。从硬件准备到参数自整定,再到高级调优与异常处理,手把手教你实现实验室级别的静音效果,提升打印质量和使用体验。

weixin_33724659的博客 488

JavaScript弱类型:隐式转换与内存泄漏的“陷阱指南”

JavaScript 的弱类型特性是其灵活性和动态性的体现,但同时也为开发者在逆向工程和调试中带来了一些潜在的挑战。

爪巴虫 632

YOLOv13改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv13-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 355

VS Code下载安装与使用教程

VSCode下载安装与使用教程

weixin_46713695的博客 4万+

SystemVerilog | 永不缺席的话题:类型转换(Type Casting)

”永不缺席“绝不是一个夸大的形容词,即使是针对SystemVerilog这种具有硬件气质的语言。 数据类型的处理规则在编程中会影响很多东西,涉及变量安全、内存安全等,具体包括变量赋值、过程参数、函数调用和返回值。换句话说,但凡上手写代码,就逃不过数据类型的处理规则。 类型转换是数据类型处理规则中重要的一项,几乎每一种编程语言都有自家关于数据类型转换的规则。数据类型的转换有时候是隐式的(implicitly),有时候是显式的(explicitly),有些是编译阶段(compile-time)完成的,有些是运行

oldmoney 481

C2f-DCN模块详解:可变形卷积与特征融合的完美结合

C2f模块作为YOLOv8的核心创新,代表了目标检测特征提取模块设计的最新进展。通过精简的卷积配置(仅2个基础卷积)、高效的特征重用设计(部分通道分割复用)、以及深层语义与浅层细节的协同建模能力,C2f在结构设计和性能表现上全面超越了前代的C3模块。与C3K2、C3K等变体相比,C2f在遮挡和密集环境下的检测鲁棒性更优,而C3K2和C3K分别在高速检测和多尺度检测方面有专门优化。这种差异化设计反映了YOLO系列模型向场景化、专业化发展的趋势。从设计原理角度看,C2f的核心优势在于其多路径梯度流动优化和。

浩瀚之水的专栏 379

Python 数据类型转换的内部机制与性能分析

``html Python 数据类型转换的内部机制与性能分析。

2501_91247610的博客 1522

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++中四种cast转换

C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast const_cast 用于将const变量转为非const static_cast 用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知; dynamic_cast 用...

瞎子my的博客 2282

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Q3:C++中的四种cast转换

static_cast、dynamic_cast、const_cast、reinterpret_cast

不积跬步无以至千里 231

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Apache Groovy闭包编程终极指南:为什么它比Java Lambda更强大

Apache Groovy是一种功能强大的多范式编程语言,专为JVM平台设计。Groovy闭包作为其核心特性之一,提供了比Java Lambda表达式更灵活、更强大的编程能力。本文将深入探讨Groovy闭包编程的完整指南,揭示其超越Java Lambda的独特优势。 ## 📌 Groovy闭包基础:从入门到精通 Groovy闭包是一个开放的、匿名的代码块,可以接受参数、返回值,并分配给变量。

gitblog_00692的博客 483
上一篇: Project Euler解题汇总 051 ~ 060
下一篇: Java.next:第一部分——共同点
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值