先讨论一下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
- 浏览 4802
- 评论(6)
- 论坛回复 / 浏览 (6 / 6702)
- 查看更多
相关推荐
wire类型变量不能存储值,且必须要受到驱动器(如门或连续赋值语句)的驱动。如果没有驱动器连接到wire类型变量上,则该变量就是高阻的,即值为Z。wire类型变量常用于表示组合逻辑信号,VERILOG程序模块中的输入、...
首先,我们要理解**数据类型**。数据类型是C语言的基础,它定义了变量能够存储的数据种类。C语言的基本数据类型包括整型(如int)、浮点型(如float和double)、字符型(如char)和布尔型(bool)。此外,还有指针、...
WinCC的变量管理器中有一个称为“结构变量”的功能,允许用户通过图形化界面定义结构变量的成员变量和数据类型。创建结构变量后,我们可以将这个结构变量分配给一个或多个变量组或连接。 如果要将结构变量从一个...
str1 = "有喜欢的人一定要表白~你丑没关系,万一她瞎呢?" print(str1) ``` 此外,Python 还支持同时为多个变量赋相同的值,例如: ```python str1 = str2 = -1000 print(str1, type(str1), id(str1)) print(str2, ...
在数学中,我们对变量的概念有一定的了解和认识,如y=x2,其中x是自变量,y是因变量。在计算机中,变量是一个存储器中的存储空间,可以存储不同的数据类型,如整数、字符、浮点数等。 2. 变量的概念 一个变量就是...
本篇将详细介绍如何在对话框上增加编辑框并关联控制类型的变量。 首先,我们需要创建一个对话框资源。在VC++的ResourceView中,选择"Dialog"类型,然后右键点击新建一个IDD_DLGTEST类型的对话框。在对话框的设计...
本文档聚焦于C#的基础变量与数据类型,这是学习任何编程语言的第一步,也是构建强大程序的基石。 1. 变量:在C#中,变量可以被视为存储数据的容器。每当你需要在程序中存储一个值时,就需要声明一个变量。声明变量...
变量类型是编程语言中非常重要的一个概念,全局变量、局部变量、静态变量都是程序员经常使用的变量类型,但是这些变量类型之间的区别和联系却经常让人感到困惑。今天我们将详细地探讨这些变量类型之间的区别和联系,...
顺序变量作为分类变量的一种,能够表现出一定的顺序或等级,例如教育程度中的“小学”、“中学”、“大学”等。名义变量则不具有顺序意义,只是用来区分不同的事物或特征,如血型。 李克特量表的变量类型从本质上来...
在VB(Visual Basic)编程语言中,动态变量是一种在运行时声明和使用的变量,与静态变量相比,它们不需要在程序的开头就明确声明其类型和名称。动态变量的使用为程序员提供了更大的灵活性,使得代码更加适应多变的...
然而,对于初学者来说,掌握C语言的一些核心概念仍然存在一定的难度,尤其是在处理函数的递归调用、局部变量与全局变量的区别以及指针的使用等方面。本文旨在深入探讨C语言中的局部变量和全局变量,通过具体的例子和...
Python,作为一种动态类型的编程语言,其变量声明的方式与其他静态类型语言有着显著的不同。在Python中,变量的声明不需要指定数据类型,这为开发者提供了极大的灵活性。本文将深入探讨Python中的变量声明,包括其...
这种命名方式有助于区分成员变量与类的其他成员(如方法等)。 **示例:** ```cpp class Document { public: void PrintInfo() { std::cout ; std::cout ; } private: std::string m_DocName = "Untitled"; //...
Python 是一种动态类型的语言,它的变量类型是在运行时根据赋值自动确定的。变量是程序中存储信息的容器,它们可以存储各种不同类型的值,如整数、浮点数、字符串、列表、字典等。在Python中,创建变量并不需要预先...
变量名必须遵循一定的规则,只允许包含字母、数字和下划线,并且第一个字符不能是数字。标识符是区分大小写的,因此"sum"和"SUM"是两个不同的变量。 在C++中,整型数据是最常见的数据类型之一,它们用于存储整数。...
U-Boot 环境变量设置方法 在 U-Boot 中,环境变量扮演着至关重要的角色,它可以由用户自己定义,但也有...但是,需要注意的是,在设置环境变量时,一定要遵守 U-Boot 的规则和约定俗成的变量名,否则可能会导致错误。
类型转换则是将一种数据类型转换为另一种,这在处理不同数据类型的变量相加或比较时尤其有用。例如,如果需要将一个int和一个float相加,可能需要将int转换为float。 输入输出函数`scanf()`和`printf()`是C语言的...
在进行数学运算时,不同类型的变量会根据需要进行类型转换,例如,较小的类型会自动转换为较大的类型,有符号类型会转换为无符号类型。但是,如果无符号类型在运算中变成了负值,其结果可能会产生未定义的行为。 ...
在C语言中,`volatile`是一个类型限定符,用于告知编译器不要对该变量进行优化,因为它可能在任何时候被未知的外部源更改。当一个变量被声明为`volatile`时,编译器会假设它的值可能在任意时间发生变化,因此每次...
JavaScript是一种动态类型的语言,这意味着变量的类型可以在程序运行时发生变化。例如,一个变量最初可以存储一个字符串,随后可以在程序的其他部分将其改为存储一个数字。 **1.2 变量的命名规则** - **命名规则**...