变量一定要有类型吗(二)
变量一定要有类型吗?不一定。
在《The Ruby Way 2nd》一书中,1.2.3节 Constants, Variables, and Types
“In Ruby, variables do not have types, but the objects they refer to still have types. ” 在Ruby中,变量没有类型,但变量引用的对象有类型。
1.5.2节 Perspectives in Programming
“In Ruby, variables don't have classes; only values have classes.” Ruby里, 变量没有类别;只有值才有类别。
《The Ruby Way 2nd》所描述是真的吗?口说无凭,程序为证。
a=5
puts "a = #{a}, #{a.class}" # => a = 5, Fixnum
a="hh" # a: 5 --> "hh"
puts "a = #{a}, #{a.class}" # => a = hh, String
变量a只是一个符号,当a指向一个表达式的时候,那个表达式的值也许是Fixnum,也许是String。变量a并没有什么事先预定的类型;而且变量a在事后也不会固定在什么具体的类型上。
a = x==nil ? 2 : x**2 < x<<2 ? 2.0 : ""
puts a.class
你能告诉我,变量a是什么类型吗?你如果问我,我只能说:
假设x = 2,程序输出为Float;
假设x = 4,程序输出为String;
假如x 是一个无返回值的方法,程序输出为Fixnum。
Gödel在证明不完备性定理时,用一个正整数指代某个数值;用另一个正整数指代某个运算符;而且,公式也用正整数指代;定理也用正整数指代…正整数只是符号,数值、运算符、公式、定理有区别,正整数没有类型差别。
变量只是符号,变量没有类型你如果不能接受,那么,我们自小熟悉的正整数只是代表不同类事物的符号,也许会让你发疯。
完备性、一致性、可证性似乎与主题不相关,其实,计算机编程语言是形式数学的直接产物。最初的LISP语言哪里有变量类型的概念,从C一路走来,到C++,到Java,变量的概念中塞入了太多的东西。一个子类拥有许许多多的内容,它父类的父类,最初的根类,只是一个符号。
你也许认为,变量有类型拓展了我们表达事物的能力,可事实是,如今Java程序、C++程序所作的并没有超越Turing当初的构想。假如某个语言因为变量有类型而实现了智能化,请你一定,一定要mail me。
人们在编程语言的道路上行走了几十年,跌跌绊绊,缝缝补补,没能见到希望中的曙光。这一切的努力是有意义的,但也许应该回到起初的地方,认真审视,重新选择方向。Ruby是一个值得去做的尝试。
A). Rails框架充分发挥了Ruby的动态性,继承ActiveRecord时,数据库中的表将被映射为一个Ruby类,你不用操心字段值的类型。在Java及其上的框架中则作不到。
B).假设有一个Java EE 项目,几个人分别在PowerDesigner里定义了几百甚至上千张表,连接上数据库,PowerDesigner 帮你自动在库中生成了这些表;在Hibernate 里SessionFactory创建JDBC连接, MyEclipse 为你自动生成了每张表相应的JavaBean。你现在要将表中的内容显示在前端网页表格中,不是很难,可问题是,每个表有几个字段,十几个字段,甚至更多,你显示的时候不仅要考虑到getXXX(),还要顾及到返回类型,有些字段又没有定义缺省值,上万个字段实在是无休止的折磨。假设出现在生活中,你只能无奈地写一个Java类,定义成静态方法,是为了直接调用。都是类型惹得祸。
//package com.lilytech.hr.rsgl;
/*
* Created on 2006-4-21
*
*/
/**
* @author Kaichuan Zhang
*
*/
public class Wrap {
public static String tostring(Object obj){
try{
return (obj!=null)?obj.toString():"";
}catch(Exception err){
return "";
}
}
public static String tostring(long obj){
try{
return (new Long(obj)).toString();
}catch(Exception err){
return "";
}
}
public static String tostring(double obj){
try{
return (new Double(obj)).toString();
}catch(Exception err){
return "";
}
}
public static String tostring(boolean obj){
try{
return (new Boolean(obj)).toString();
}catch(Exception err){
return "";
}
}
}
一门语言的变量有无类型,对于其上的框架之影响,如你在A). 与B).比较中所见。
结语:像Java,C++这样的静态语言需要变量有类型。而对于Ruby这样的动态语言,变量未必需要有类型。
分享到:
相关推荐
实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。 见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的...
2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值; 3) 赋值语句为“:=”; 4) 变量可以认为是数据库里一个字段; 5) 规定没有初始化的变量为NULL; ---- 第三章 变量与数据类型 ---- 1. 数据类型 1) ...
由于数值的类型有多种,有整数、小数(浮点数)、字符等等,那么对应的变量就有整型变量、浮点型变量、字符型变量。变量还有其他的具体分类。整型变量还可具体分为无符号型、长整型和短整型。浮点型也可分为单精度型...
变量有哪些数据类型? 变量的命名语法规范(合法) 1、以字母、下划线或美元符号开头,后面跟字母、下划线、美元符号或数字。 2、java的变量名没有长度限制。 3、java的变量名对大小写敏感。 驼峰命名法(正确) 1...
在函数体中也有类型说明, 这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值, 此时函数类型符可以写为void。 我们可以改为一个函数定义: void Hello() { printf ("Hello,world \n...
1、python环境搭建: 进入官方网站进行python下载: ...第二个红框中的path变量一定要勾选添加,避免后续手动添加的麻烦 2、默认选项继续下一步 3、如图勾选并自定义安装路径,然后点击install进行安装
JavaScript的基础语法与其他编程语言有许多相似之处,包括变量、数据类型、运算符、条件语句和循环语句等。 变量和数据类型:JavaScript是一种弱类型语言,变量的类型会在赋值时自动确定。常见的数据类型包括数字...
多用于类型定义,如在Oberon中,integer 便是用来定义变量类型的关键 字。还有其他的功能如作为程序语言中的某个特定函数的名称,如 write,read等(在 Oberon中). 不同的语言的关键字和保留字的概念区分是不一样的...
自己整理的C++要背的一些概念,华南师范大学考c++的建议看看,21届考研有考到哦!!(可打印版) 1. 面向对象的三个基本特征 4 2. 抽象 4 3. 如何实现多态性 4 4. const与define的区别 4 5. static作用 4 6. 静态...
书中用一章来介绍浮点数的表示、浮点运算指令和编程方法,使读者对高级语言中的各种数据类型与低层实现之间的联系有一个更清晰的认识。还用一章介绍了用汇编语言编写Windows应用程序的基本方法,为拓宽汇编语言的...
常用的概率分布类型及其特征 3.1 二点分布和均匀分布 1、 两点分布 许多随机事件只有两个结果。如抽检产品的结果合格或不合格;产品或者可靠的工作,或者失效。描述这类随机事件变量只有两个取值,一般取0...
子程序的局部变量一定要遵循“先赋值后使用”的原则。 S7-200的子程序使用临时变量来传递参数,OUT类型的参数不会把实参读入形参,所以这里使用OUT形参的触点就出现了临时变量未赋值先使用的情况。将输出参数...
如一定要把数值赋予枚举变量,则必须用强制类型转换,如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue; 还应该说明的是枚举元素不是字符常量也不是字符串常量, 使用时不要加单...
二、工程任务分解本章工程可以划分为以下主要任务: 工程1:猜数字游戏任务1:确定变量任务2:选择数据类型任务3:确定表达式 任务4:循环猜数,并统计次数 三、任务1・1:确定变量 任务分析 猜数游戏中需要计算机产生...
用,变量和方法可以通过设定一定的访问权限(见下面的例子)来允许或禁止其它对象对它的 访问。 我们先定义一个类 Point。 例子: class Point{ int x,y; String name = "a point"; Point(){ x = 0; y = 0; } Point( ...
包括了13章的详细介绍,相信大家对C语言一定会有浓厚的兴趣 第一章:1 C语言概述 1.1 C语言的发展过程 1.2 当代最优秀的程序设计语言 1.3 C语言版本 1.4 C语言的特点 1.5 面向对象的程序设计语言 1.6 C...
2.4.2 容器=数据类型,标签=变量名 2.4.3 数据类型修饰符 2.4.4 问题分析:整型数据究竟有多大 2.5 C++中的变量声明 2.5.1 C++的命名规则 2.5.2 在哪里声明变量 2.6 C++中的运算符 2.6.1 计算路程的程序 2.6.2 从...
C语言基础知识:包括数据类型、变量定义与声明、常量、运算符、表达式和语句等基本概念。 流程控制语句:包括选择结构(if语句、switch语句)、循环结构(for循环、while循环、do-while循环)等。 函数:包括函数的...
常量是有数据类型的 变量必须声明其数据类型 (1)划分: 1.基本数据类型(四类八种) 数值型: 整数型:bute、short、int、long 浮点型:float、double 字符型:char 布尔型:boolean 2.引用数据类型:除...