先讨论一下Ruby是不是强类型。
1).在《Beyond Java》
September 2005 一书 6.1.2节Typing 中,Bruce Tate举例
irb(main):015:0> "fish"+4
TypeError: cannot convert Fixnum into String
from (irb):15:in‘+’
from (irb):15
从而得出结论:
引用
That means Ruby is strongly typed.
我们知道,Ruby是动态语言,在运行中边解释、边检测、边执行,检测类型匹配吗?不是检测类型匹配,而是检测语法。
String类的‘+’是一个方法,但是,Ruby从来不拒绝你重写方法。
class String
alias : old_plus :+
def +(other)
self.old_plus(other.to_s)
end
end
puts "fish"+4 # => fish4
puts '1 ' + 2.3 # => 1 2.3
2).Bruce Tate 在“跨越边界: Java 模型以外的类型策略”
2006 年 6 月 一文中写到:
引用
...这两种语言都 倾向于 强类型...
这两种语言是指Java和 Ruby,他给出了一行Ruby代码来说明;
1 + "hello"
会收到以下错误消息:
TypeError: String can't be coerced into Fixnum
from (irb):3:in '+'
from (irb):3
字面值1是Fixnum类的实例对象,让我们重写Fixnum类的‘+’方法,使得‘+’的语法不再出错;
class Fixnum
alias : old_plus :+
def +(other)
(other.class.eql?String) ? (self.to_s << other) : (old_plus(other))
end
end
puts 1 + "hello" # => 1hello
puts 1 + " 2.3" # => 1 2.3
3). Ruby是简单的,我们可以只管按照别人说的去使用;Ruby也是灵活而复杂的,我们可以按照自己的需求去使用;
require "another_plus3"
puts 'he'+1 # => he1
puts '1.5'+2 # => 3.5
puts 1+" he" # => 1 he
puts 1 + " 2.3" # => 3.3
puts 1 + 2.3 # => 3.3
puts 1.6 * "2.7" # => 4.32
puts 1 -"2.3" # => -1.3
类型错误根本不存在,如果语法错误算是强类型,我无言。Bruce Tate是大牛,他断言Ruby是强类型,国内的牛们也跟着如是说。
在1).中, Bruce Tate断言Ruby是强类型;
在2).中, Bruce Tate认为Ruby 倾向于 强类型。
后文“变量一定要有类型吗(二)”将更进一步说明。
#another_plus3.rb
class String
alias : old_plus :+
def +(other)
(Float(self)) + (Float(other)) rescue (self.to_s).old_plus(other.to_s)
end
def coerce(other)
case other
when Integer : return other, Integer(self) rescue return Float(other), Float(self)
when Float : return other, Float(self)
else super
end
end
end
class Fixnum
alias : old_plus :+
def +(other)
(other.class.eql?String)?(old_plus(Float(other)) rescue self.to_s<<other):(old_plus(other))
end
end
class Float
alias : old_plus :+
def +(other)
(other.class.eql?String)?(old_plus(Float(other)) rescue self.to_s<<other):(old_plus(other))
end
end
========
题外话
假设若干年后,有一篇搜索引擎报告指出:
A)21世纪初期,网络信息以中文和英文居多;
B)其中中文信息多数是英文信息的跟风之作,
从发布时间得出,英文信息居前;
从信息不确切度得出,中文信息没有经过中文世界的思维、理解与吸收,英文信息如何错误,中文信息也有相似度极高的错误...
...
我衷心地希望与你,一起唱和出中文技术论坛自身的弦音。
分享到:
- 2007-03-01 06:30
- 浏览 4760
- 评论(6)
- 论坛回复 / 浏览 (6 / 6666)
- 查看更多
相关推荐
实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。 见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的...
在Python语言中,声明变量的同时需要为其赋值,毕竟不代表任何值的变量毫无意义,Python语言中也不允许有这样的变量。 声明一个变量也非常简单,语法结构如下: variable_name = variable_value 等号(=)左侧是...
变量名:每个变量都必须有一个名字。变量的命名应遵循标识符的命名规则。 变量值:变量在程序运行过程中,占据一定的内存存储单元,用来存放变量的值。不同类型的变量所占用的内存单元的大小不同,变量值随着变量...
在C#中,变量的命名需要遵循一定的规则,如不能以数字开头,不能使用保留关键字等。声明变量时,可以同时初始化变量的值,也可以在后续的代码中赋值。C#中的变量可以是局部变量、成员变量、静态变量等,具有不同的...
若我们在程序中定义了一个变量,C编译系统就会根据定义的变量的类型为其分配一定字节数的内存空间(如:字符型占1个字节,整型占2字节,单精度实型占4字节,双精度实型占8字节)。每个变量所占存储单元的第一字节的...
作者:曾宏安,华清远见嵌入式学院讲师。 我们在程序中会经常定义一些变量来保存和处理数据。从本质上看,变量代表了一段可操作的...一、在程序运行时内存中有三个区域可以保存变量:静态存储区、栈(stack)和堆(he
2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值; 3) 赋值语句为“:=”; 4) 变量可以认为是数据库里一个字段; 5) 规定没有初始化的变量为NULL; ---- 第三章 变量与数据类型 ---- 1. 数据类型 1) ...
枚举类型 5-1 枚举类型的定义 有些变量的取值仅限于可一一列举出来的几个固定值。...如果一定要把数值赋予枚举变量,那么必须用强制类型转换,如a=(enum weekday)2;的意义是将顺序号为2的枚举元素赋予枚举变
概括的说,字符设备驱动主要要做三件事:1、定义一个结构体static struct file_operations变量,其内定义一些设备的打开、关闭、读、写、控制函数;2、在结构体外分别实现结构体中定义的这些函数;3、向内核中注册或...
指针在定义的时候不一定要初始化,并且指向的空间可变。(注:不能有引用的值不能为NULL) 3)有多级指针,但是没有多级引用,只能有一级引用。 4)指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时...
主要给大家介绍了关于阿里规范:为何boolean类型变量命名禁用is开头的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一个变量应该有一个名字,并在内存中占据一定的存储单元,在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念,见图 变量名规则 先介绍标识符的概念。和其他高级语言一样,用来标识变量、符号...
【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:matlab 产生高斯随机粗糙面的函数 输入变量为点数 长度 相关长度 均方根高度 资源类型:matlab项目全套源码 ...适合人群:新手及有一定经验的开发人员
对类型而言,声明不一定能知道其对象占用空间大小,但根据定义肯定能确定内存占用。说静态成员与C++方式是相容的,因为其初始化方式与方法的定义一致。下面是一个例子: // Foo.hpp namespace tlanyan { // 类声明...
主要介绍了python变量与简单数据类型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
基本原则 变量与数据类型 总的来说,由于WMLScript是以C语言为蓝本制定的,因此其语法特征和C语言很相象。在学习的过程当中,可以参考C语言。 本节介绍WMLScript 中的两个重要概念:变量和数据类型。 ...
7.3 动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具? 10 8 字符串 10 8.1 strlen()函数的返回值是什么类型的? 10 8.2 字符串strlen() 的值,是否和他占据的内存空间相同? 10 8.3 你是否知道...
在工程结构可靠性设计中,同一个功能函数由于其随机变量的分布类型的不同,所求得的可靠度指标值往往也会不同。为了进一步研究随机变量的分布类型对可靠度指标和失效概率的具体影响,首先简要地介绍了验算点法(JC法)的...
由于数值的类型有多种,有整数、小数(浮点数)、字符等等,那么对应的变量就有整型变量、浮点型变量、字符型变量。变量还有其他的具体分类。整型变量还可具体分为无符号型、长整型和短整型。浮点型也可分为单精度型...
在Python中,变量的命名需要遵循一定的规则,同时要避免一些常见的错误和陷阱。 3. 数据类型和变量是密不可分的,在Python中我们需要将数据存储在变量中,并指定对应的数据类型,数据类型和变量的使用是密切相关的。...